111,073
社区成员




网上看MODBUS RTU的指令,第二位就写功能码,如
写寄存器0为1:
主机发送:01 06 00 00 00 01 48 0A
从机返回:01 06 00 00 00 01 48 0a
可是我在网上下了一个MODBUS TCP的源码,他在第8位才写功能码,如
private byte[] CreateWriteHeader(ushort id, ushort startAddress, ushort numData, ushort numBytes, byte function)
{
byte[] data = new byte[numBytes + 11];
byte[] _id = BitConverter.GetBytes((short)id);
data[0] = _id[0]; // Slave id high byte
data[1] = _id[1]; // Slave id low byte+
byte[] _size = BitConverter.GetBytes((short)IPAddress.HostToNetworkOrder((short)(5 + numBytes)));
data[4] = _size[0]; // Complete message size in bytes
data[5] = _size[1]; // Complete message size in bytes
data[6] = 0; // Slave address
data[7] = function; // Function code
byte[] _adr = BitConverter.GetBytes((short)IPAddress.HostToNetworkOrder((short)startAddress));
data[8] = _adr[0]; // Start address
data[9] = _adr[1]; // Start address
if (function >= fctWriteMultipleCoils)
{
这下我被搞蒙了,难道是二个不同的MODBUS吗,可这二个都 是MODBUS tcp啊
你可以看我的modbus代码保真
Modbus TCP 报文包括以下几个主要部分:
Transaction Identifier (2 bytes): 用于标识 Modbus 请求/响应事务的唯一标识符。
Protocol Identifier (2 bytes): 对于 Modbus 协议,这个字段是 0x0000。
Length (2 bytes): 后续整个消息的长度(单位为字节),包括 Unit Identifier、功能码和数据。
Unit Identifier (1 byte): 从站 ID,用于标识接收或响应消息的单个 Modbus 节点。
tcp协议和串口不一样,tcp 的扩展了标准协议规则
data[0] = _id[0]; // Slave id high byte
data[1] = _id[1]; // Slave id low byte+
不用看了,这就貌似已经错了。标准modbus id地址就一个byte。范围是1-247.
哪里来的高位,低位。
这个别问我们了,先问你的下位机童鞋,他要告诉你他的modbus 地址位是2字节,你在来说这代码的事情
网上有别人封装好的DLL 只需要拿来就行了. 似乎就传个地址 其他什么都不用管了
不一样.. tcp是对tru的扩展. 报文内容不一样的. 是需要在原有结构上新增头.
这就表示你方法里的 叫createXXXXHeader .