在串行链路中,我们(Modbus)使用一种简单的主从协议(客户机/服务器协议)进行通信。客户机作为主站,向服务器发送请求;服务器(从站)接到请求后,对请求进行分析并作出应答。我和小伙伴的通信帧被称为应用数据单元(Application Data Unit,ADU),它包括通信地址段、功能代码段、数据段和校验段,如下图:
其中,功能代码段和数据段组合称为协议数据单元(Protocol Data Unit,PDU)。功能代码段占用一个字节,取值范围为1~255,其中128~255为保留值,用于异常消息应答报文。1~127为功能代码编号,其中65~72和100~110为用户自定义编码,具体请看下面这张图片:
通用功能编码(Public function code)是已经公布的功能代码,有确定的功能,用户不能修改。比如:0x01表示读取线圈,0x02表示读取离散量的输入等等。下图是一些常用的功能代码的描述:
该PDU指令中,第一个字节表示功能号“05”表示对单独线圈进行写操作(write single coil);第二个字节表示线圈地址的高字节位,第三个字节表示线圈地址的低字节位(线圈的编号从0开始)。本例程中,第173号线圈的序号为172(0x00AC);第四个字节表示输出值得高字节位,第五个字节表示输出值的低字节位。对于单独线圈操作,0xFF00表示置位(ON),0x0000表示复位(OFF);不同的功能代码,其参数的字节的定义不同,使用时要参考下手册哦。