C# 如何正确转换值;通过modbus接收?
我在C#上的控制台程序中通过modbus rtu从设备获取数据,该程序带有库Nmodbus4。格式:32位浮点。我通过寄存器0x0D–0x0F请求设备。我的回答是513235958458。这个答案应该符合2020 121411:33:~35。i、 e数据格式为[年][月][日][时][分][秒]。下面是我的代码:C# 如何正确转换值;通过modbus接收?,c#,modbus,modbus-rtu-over-tcp,C#,Modbus,Modbus Rtu Over Tcp,我在C#上的控制台程序中通过modbus rtu从设备获取数据,该程序带有库Nmodbus4。格式:32位浮点。我通过寄存器0x0D–0x0F请求设备。我的回答是513235958458。这个答案应该符合2020 121411:33:~35。i、 e数据格式为[年][月][日][时][分][秒]。下面是我的代码: using Modbus.Device; using Modbus.Utility; using System; using System.Collections; using Sys
using Modbus.Device;
using Modbus.Utility;
using System;
using System.Collections;
using System.Globalization;
using System.IO.Ports;
namespace Elemer19
{
class Program
{
static void Main(string[] args)
{
string[] pathFolder = ReadDirectory.readDir();
Console.WriteLine("OPENING COM PORT - {0}", pathFolder[0]);
byte slaveID = 4;
ushort startAddress = 0x0D;
ushort numOfPoints = 3;
SerialPort _serialPort = new SerialPort(pathFolder[0],
9600,
Parity.None,
8,
StopBits.One);
try
{
_serialPort.Open();
ModbusSerialMaster master = ModbusSerialMaster.CreateRtu(
_serialPort);
master.Transport.ReadTimeout = 300;
ushort[] date = master.ReadHoldingRegisters(slaveID, startAddress, numOfPoints);
foreach (int item in date)
{
Console.Write("\r\n{0}", item); //5132, 3595, 8458
}
}
catch (Exception ex)
{
Console.WriteLine(DateTime.Now.ToString() + ":Connect process " + ex.StackTrace +
"==>" + ex.Message);
}
Console.ReadLine();
}
}}
设备中的日期格式:两个寄存器组合位字段中的日期和时间(从最低有效字节的最低有效位开始):
如何正确获取日期值?您的位解码信息似乎有误 如果将这三个数字作为单独的字节(20、12、14、11、33、10)写入,则可以从这些字节中直接提取期望值:
DateTime ConvertToDateTime(ushort[] data)
{
var year = (int)(data[0] >> 8);
var month = (int)(data[0] & 0xFF);
var day = (int)(data[1] >> 8);
var hour = (int)(data[1] & 0xFF);
var minute = (int)(data[2] >> 8);
var second = (int)(data[2] & 0xFF);
return new DateTime(2000 + year, month, day, hour, minute, second);
}
收益率:2020-12-14 11:33:10您的位解码信息似乎是错误的 如果将这三个数字作为单独的字节(20、12、14、11、33、10)写入,则可以从这些字节中直接提取期望值:
DateTime ConvertToDateTime(ushort[] data)
{
var year = (int)(data[0] >> 8);
var month = (int)(data[0] & 0xFF);
var day = (int)(data[1] >> 8);
var hour = (int)(data[1] & 0xFF);
var minute = (int)(data[2] >> 8);
var second = (int)(data[2] & 0xFF);
return new DateTime(2000 + year, month, day, hour, minute, second);
}
收益率:2020-12-14 11:33:10我的回答是513235958458-你应该得到三个16位的数字,而不是一个也超出ushort范围的数字。你能把你得到的真实数据发出去吗?@KlausGütter是的,我错在一起了。我的答案是513235958458。在我看来,结果是5132[年][月]3595[日][时],8458[分][秒]。我不明白如何转换成可读的日期。@KlausGütter Done。谢谢你指出错误。我的回复是513235958458-你应该得到三个16位的数字,而不是一个也超出ushort范围的数字。你能把你得到的真实数据发出去吗?@KlausGütter是的,我错在一起了。我的答案是513235958458。在我看来,结果是5132[年][月]3595[日][时],8458[分][秒]。我不明白如何转换成可读的日期。@KlausGütter Done。谢谢你指出错误。