被modbus的指令搞蒙了

那该多好啊!!! 2024-07-26 13:24:26

网上看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啊

...全文
126 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
qinlu_csdn 07-26
  • 打赏
  • 举报
回复

你可以看我的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字节,你在来说这代码的事情

by_封爱 版主 07-26
  • 打赏
  • 举报
回复

网上有别人封装好的DLL 只需要拿来就行了. 似乎就传个地址 其他什么都不用管了

by_封爱 版主 07-26
  • 打赏
  • 举报
回复

不一样.. tcp是对tru的扩展. 报文内容不一样的. 是需要在原有结构上新增头.

这就表示你方法里的 叫createXXXXHeader .

110,939

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧