C# 如何正确转换值​;通过modbus接收?

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

我在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 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。谢谢你指出错误。