4. 写多个字的命令(本例是写2号站%MW20起始的3个字): Dim WriteStr() As Byte k = 6 ,写6个字节 ReDim WriteStr(8 + k)
WriteStr(0) = 2 ,从站号是2
WriteStr(1) = &H10 ,写多个字的命令代码 WriteStr(2) = 0 ,起始地址高字节 WriteStr(3) = 20 ,起始地址低字节
WriteStr(4) = &H0 ,数据长度高字节<字的个数> 字串5 WriteStr(5) = k / 2 ,数据长度低字节<字的个数>
WriteStr(6) = k ,数据长度<字节的个数> WriteStr(7) = &H12,写的第1个字的高字节 WriteStr(8) = &H34,写的第1个字的低字节 WriteStr(9) = &H56,写的第2个字的高字节 WriteStr(10) = &H78,写的第2个字的低字节 WriteStr(11) = &H9A,写的第3个字的高字节 WriteStr(12) = &HBC,写的第3个字的低字节
Call crc16(WriteStr(), 6 + k)
WriteStr(9 + (k / 2 - 1) * 2) = HiByte,
WriteStr(10 + (k / 2 - 1) * 2) = LoByte
MSComm1.InBufferCount = 0 MSComm1.Output = WriteStr ,写命令发送后,当接收到8个字节时中断 CmdLenth = 8
MSComm1.RThreshold = CmdLenth
5. 通讯事件中断产生时的数据处理: Private Sub MSComm1_OnComm() Dim inx() As Byte
Select Case MSComm1.CommEvent Case comEvReceive ,判断为接收事件
MSComm1.InputLen = CmdLenth ,接收数据的长度 字串3
inx = MSComm1.Input ,接收数据 MSComm1.InBufferCount = 0
For k = 3 To CmdLenth - 3
tmpstr = tmpstr & \ Next
Text1.Text = tmpstr ,以十六进制显示所接收长度的数据 Beep End Select End Sub
MODBUS通讯协议: ModBus通讯规约允许PDM系列仪表/变送器与施耐德、西门子、AB、GE等多个国际著名品牌的可编程顺序控制器(PLC)、RTU、SCADA系统、DCS或与第三方具有ModBus兼容的监控系统之间进行信息交换和数据传送。 PDM系列仪表/变送器只要简单地增加一套基于计算机(或工控机)的监控软件(如:组态王、Intouch、FIX、synall等)就可以构成一套电力监控系统。 广泛的系统集成: PDM系列仪表/变送器提供了标准的RS-485/422通讯接口及ModBus通讯协议,这个通讯协议已广泛被国内外电力行业及工控行业作为系统集成的标准。 通讯数据的类型及格式: 信息传输为异步方式,并以字节为单位。在主站和从站之间传递的通讯信息是11位的字格式: 字格式(串行数据) 起始位 11位二进制 1位 数据位 奇偶校验位 停止位 ● 通讯数据(信息帧)格式 数据格式: 数据长度: 1字节 1字节 N字节 地址码 功能码 数据区 8位 1位:有奇偶校验位/无:无奇偶校验位 1位:有奇偶校验位/2位:无奇偶校验位 错误校检 16位CRC码(冗余循环码) ★ 注:1、1个字节由8位二进制数组成(既8 bit)。 2、ModBus是Modicon公司的注册商标。 3、“从机”在本文件中既为PDM。 一、通讯信息传输过程: 当通讯命令由发送设备(主机)发送至接收设备(从机)时,符合相应地址码的从机接收通讯命令,并根据功能码及相关要求读取信息,如果CRC校验无误,则执行相应的任务,然后把执行结果(数据)返送给主机。返回的信息中包括地址码、功能码、执行后的数据以及CRC校验码。如果CRC校验出错就不返回任何信息。 1.1 地址码: 地址码是每次通讯信息帧的第一字节(8位),从0到255。这个字节表明由用户设置地址的从机将接收由主机发送来的信息。每个从机都必须有唯一的地址码,并且只有符合地址码的从机才能响应回送信息。当从机回送信息时,回送数据均以各自的地址码开始。主机 发送的地址码表明将发送到的从机地址,而从机返回的地址码表明回送的从机地址。相应的地址码表明该信息来自于何处。 1.2 功能码: 是每次通讯信息帧传送的第二个字节。ModBus通讯规约可定义的功能码为1到127。PDM系列仪表/变送器仅用到其中的一部分功能码。作为主机请求发送,通过功能码告诉从机应执行什么动作。作为从机响应,从机返回的功能码与从主机发送来的功能码一样,并表明从机已响应主机并且已进行相关的操作。 表8.1 MODBUS部分功能码 功能码 02 01 03 05 06 10 1.3 数据区: 数据区包括需要由从机返送何种信息或执行什么动作。这些信息可以是数据(如:开关量输入/输出、模拟量输入/输出、寄存器等等)、参考地址等。例如,主机通过功能码03告诉从机返回寄存器的值(包含要读取寄存器的起始地址及读取寄存器的长度),则返回的数据包括寄存器的数据长度及数据内容。对于不同的从机,地址和数据信息都不相同(应给出通讯信息表)。 PDM系列仪表/变送器采用Modbus通讯规约,主机(PLC、RTU、PC机、DCS等)利用通讯命令(功能码03),可以任意读取其数据寄存器(其数据信息表详见附录)。PDM系列仪表/变送器的数据寄存器存储的电量多达几百个(如:电流、电压、功率、0~31次谐波分量等),并且都是16位(2字节)的二进制数据,并且高位在前;一次最多可读取寄存器数(既各种电量的数量)是50个。 PDM响应的命令格式是从机地址、功能码、数据区及CRC码。数据区的数据都是两个字节,并且高位在前(电能量除外)。 注:1、PDM-820AC/ACM/ACR、PDM-800AC/ACM具有“03”、“06”、“10”功能码; 2、如果PDM采用MODBUS ASCII通讯协议,其通讯数据格式为;7个数据位,1个 停止位,偶校验。 定 义 读开关量输入 读开关量输出 读寄存器数据 写开关量输出 写单路寄存器 写多路寄存器 操 作(二进制) 读取一路或多路开关量状态输入数据 读取一路或多路开关量输出状态数据 读取一个或多个寄存器的数据 控制一路继电器“合/分”输出 把一组二进制数据写入单个寄存器 把多组二进制数据写入多个寄存器 二、MODBUS功能码简介 2.1 功能码“02”:读1路或多路开关量状态输入 例如:主机要读取地址为01,开关量DI1—DI4的输入状态。 从机(PDM)数据寄存器的地址和数据为: 起始位地址 0000 主机发送的报文格式: 主机发送 从机地址 功能码 起始BIT位 读数据长度 CRC码 从机(PDM)响应返回的报文格式: 从机响应 从机地址 功能码 数据长度 DI状态数据 CRC码 2.2 功能码“01”:读1路或多路开关量输出状态 例如:主机要读取地址为01,开关量DO1,DO2的输出状态。 从机(PDM)数据寄存器的地址和数据为: 字节数 1 1 1 1 2 返回的信息 01 02 01 0B E04F 备 注 来自从机01 读开关量输入状态 1个字节(8个BIT位) DI寄存器内容 由从机计算得到CRC码 字节数 1 1 2 2 2 发送的信息 01 02 0000 0004 79C9 备 注 发送至地址为01的从机 读开关量输入状态 起始BIT位地址为0000 读取4路开关量输入状态位 由主机计算得到CRC码 DI寄存器数据(16进制) 0B 备 注 DI1/DI2/DI4状态为“1”,DI3状态为“0”