Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Modbus自定义消息&;子功能(NModbus、TCP、子功能)_C#_Modbus - Fatal编程技术网

C# Modbus自定义消息&;子功能(NModbus、TCP、子功能)

C# Modbus自定义消息&;子功能(NModbus、TCP、子功能),c#,modbus,C#,Modbus,我在一个C#项目中使用NModbus,从多个I/O设备读写Modbus数据。我在程序中使用Modbus TCP/IP协议(ModbusIpMaster等) 我已成功地与设备通信(通过Modbus网关),并可以使用默认方法(例如,常用Modbus功能,如读保持寄存器、写记录)从设备访问数据,并可以向设备回写。目前,我所能做的就是使用默认的NModbus方法公开常用的Modbus代码(1、2、3、4等) 我有两个困难: 1)可以通过Modbus代码70(0x46)访问I/O设备的设置和额外信息,我需

我在一个C#项目中使用NModbus,从多个I/O设备读写Modbus数据。我在程序中使用Modbus TCP/IP协议(ModbusIpMaster等)

我已成功地与设备通信(通过Modbus网关),并可以使用默认方法(例如,常用Modbus功能,如读保持寄存器、写记录)从设备访问数据,并可以向设备回写。目前,我所能做的就是使用默认的NModbus方法公开常用的Modbus代码(1、2、3、4等)

我有两个困难:

1)可以通过Modbus代码70(0x46)访问I/O设备的设置和额外信息,我需要使用一些子功能来读取和/或写入设置

例如,Func 07(0x46)子Func 6(0x06)可用于设置模块的通信设置。在本例中,有7个字节的信息要发送,其中包含设置(例如波特率等)

NModbus没有用于此“自定义”函数代码的特定方法(70)。因此,据我所知,需要使用NModbus的CustomMessage功能。我尝试过执行CustomMessage,当使用常见的Modbus功能代码(例如1或2)时,我可以获得与使用NModbus的默认方法相同的结果(即CustomMessage目前正在工作)

当我尝试普通代码以外的函数代码(例如1、2、3…)时,我确实会遇到各种各样的异常。此外,我不知道如何发送带有消息的子函数

当我在函数代码之后添加子函数时(例如,70后跟06),数据通过发送,我得到异常。我真的需要这方面专家的帮助

这里有一个更明显的例外:

引发“Modbus.SlaveException”类型的异常。功能代码:198异常代码:3-查询数据中包含的值 字段不是服务器(或从服务器)允许的值。这表示 复杂请求的其余部分的结构中的错误,如 因为暗示的长度是不正确的。它特别不意味着 提交以存储在寄存器中的数据项具有值 超出应用程序的预期,因为MODBUS 协议不知道任何特定价值的重要性 特定登记册。”


2)第二个问题是通过Modbus发送ASCII RS-232消息,以控制连接到模块COM1的RS-232设备,该模块具有转换Modbus消息的能力。换句话说,我计划与Modbus网关通信,向其COM1发送ASCII数据,COM1将数据转换为RS-232,然后与RS-232设备通信。翻译是在网关内部进行的,所以我需要知道的是,我到底如何通过网关发送这些信息,这些信息的长度各不相同。我不知道这是如何实现的,也不知道从何处开始。

第2部分-NModbus允许您通过TCP或UDP客户端创建ASCII主机

using (TcpClient client = new TcpClient("127.0.0.1", 502))
{
    ModbusSerialMaster master = ModbusSerialMaster.CreateAscii(client);

    // Use the master here
}

关于问题的第一部分,NModbus在基础方面非常好,但是它缺少一层允许任意扩展的抽象。当我发现需要进行重大修改才能添加GetServerId函数并使其正常工作时,我自己的经验结束了,尽管这是Modbus RTU规范的一部分。我的解决方案是从头开始重新实现它(这比首先让NModbus源代码编译和运行花费的时间要少,因为它依赖于第三方库来进行日志记录,等等&缺少IEnumerable类的扩展)。

你找到问题2的解决方案了吗)?我希望能提供帮助,我以前做过Modbus,但它都是国产的,在裸机上,从未使用过NModbus。。。