modbus规约,寄存器的地址怎么定义?我的pic芯片采集到的电压数据存放在一个数组中,我如何读取这些数据?

modbus规约,寄存器的地址怎么定义?我的pic芯片采集到的电压数据存放在一个数组中,我如何读取这些数据?,第1张

你设定一个起始地址(自己定义,不大于65535),将这个地址和你的数组的第0个元素对应。假设地址从6000开始,你的数组是a=[ 0,1,2,3,4,5,6,7,8,9],则6000对应0,6001对应1,以此类推。上位机软给个命令想获取从6000地址开始的后面2个字,格式如下:
01 03 17 6F 00 02 CRCL CRCH (假设地址为01,使用CRC16效验)
你只需要从你的数组中从0位置开始取2个字,4个字节返回就行了,格式如下;
01 03 04 00 00 00 01 CRCL CRCH

RS485是一个物理接口,简单的说是硬件。
MODBUS是一种国际标准的通讯协议,用于不同厂商之间的设备交换数据(一般是工业用途);所谓协议,也可以理解为上面有人说的“语言”吧,简单的说是软件。通俗点来讲,ModBus规约了起停电机,主机要分别发送什么命令给从机。ModBus规定主从机之间数据的交互,需要遵循什么样的格式,如何保证数据在传输过程中不发生冲突。只要都遵循这个协议,那么不同厂家的主从机就可以共用了。一般情况下,两台设备通过MODBUS协议传输数据:最早是用RS232C作为硬件接口,
(也就是普通电脑上的串行通讯口(串口));也有用RS422的,也有常用的RS485,这种接口传输距离远,在一般工业现场用的比较多。MODBUS协议又分MODBUSRTU,MODBUSASCII和后来发展的MODBUSTCP三种模式:其中前两种(MODBUSRTU,MODBUSASCII)所用的物理硬件接口都是串行(Serial)通讯口(RS232,RS422,RS485)。
而MODBUSTCP则是为了顺应当今世界发展潮流,什么都可以用Ethernet网或Internet来连接,传送数据。所以又MODBUSTCP模式,该模式的硬件接口就是以太网(Ethernet)口了,也就是我们电脑上一般用的网络口了。

MODBUS通讯协议及编程的简要概论:
ModBus通讯协议分为RTU协议和ASCII协议,我公司的多种仪表都采用ModBus RTU通讯协议,如:CH2000智能电力监测仪、CH2000M电力参数采集模块、巡检表、数显表、光柱数显表等。下面就ModBus RTU协议简要介绍如下:
一、通讯协议
(一)、通讯传送方式:
通讯传送分为独立的信息头,和发送的编码数据。以下的通讯传送方式定义也与MODBUS RTU通讯规约相兼容:
编 码 8位二进制
起始位 1位
数据位 8位
奇偶校验位 1位(偶校验位)
停止位 1位
错误校检 CRC(冗余循环码)
初始结构 = ≥4字节的时间
地址码 = 1 字节
功能码 = 1 字节
数据区 = N 字节
错误校检 = 16位CRC码
结束结构 = ≥4字节的时间
地址码:地址码为通讯传送的第一个字节。这个字节表明由用户设定地址码的从机将接收由主机发送来的信息。并且每个从机都有具有唯一的地址码,并且响应回送均以各自的地址码开始。主机发送的地址码表明将发送到的从机地址,而从机发送的地址码表明回送的从机地址。
功能码:通讯传送的第二个字节。ModBus通讯规约定义功能号为1到127。本仪表只利用其中的一部分功能码。作为主机请求发送,通过功能码告诉从机执行什么动作。作为从机响应,从机发送的功能码与从主机发送来的功能码一样,并表明从机已响应主机进行 *** 作。如果从机发送的功能码的最高位为1(比如功能码大与此同时127),则表明从机没有响应 *** 作或发送出错。
数据区:数据区是根据不同的功能码而不同。数据区可以是实际数值、设置点、主机发送给从机或从机发送给主机的地址。
CRC码:二字节的错误检测码。
(二)、通讯规约:
当通讯命令发送至仪器时,符合相应地址码的设备接通讯命令,并除去地址码,读取信息,如果没有出错,则执行相应的任务;然后把执行结果返送给发送者。返送的信息中包括地址码、执行动作的功能码、执行动作后结果的数据以及错误校验码。如果出错就不发送任何信息。
1.信息帧结构
地址码 功能码 数据区 错误校验码
8位 8位 N × 8位 16位
地址码:地址码是信息帧的第一字节(8位),从0到255。这个字节表明由用户设置地址的从机将接收由主机发送来的信息。每个从机都必须有唯一的地址码,并且只有符合地址码的从机才能响应回送。当从机回送信息时,相当的地址码表明该信息来自于何处。
功能码:主机发送的功能码告诉从机执行什么任务。表1-1列出的功能码都有具体的含义及 *** 作。
代码 含义 *** 作
03 读取数据 读取当前寄存器内一个或多个二进制值
06 重置单一寄存器 把设置的二进制值写入单一寄存器
数据区:数据区包含需要从机执行什么动作或由从机采集的返送信息。这些信息可以是数值、参考地址等等。例如,功能码告诉从机读取寄存器的值,则数据区必需包含要读取寄存器的起始地址及读取长度。对于不同的从机,地址和数据信息都不相同。
错误校验码:主机或从机可用校验码进行判别接收信息是否出错。有时,由于电子噪声或其它一些干扰,信息在传输过程中会发生细微的变化,错误校验码保证了主机或从机对在传送过程中出错的信息不起作用。这样增加了系统的安全和效率。错误校验采用CRC-16校验方法。
注:信息帧的格式都基本相同:地址码、功能码、数据区和错误校验码。
2.错误校验
冗余循环码(CRC)包含2个字节,即16位二进制。CRC码由发送设备计算,放置于发送信息的尾部。接收信息的设备再重新计算接收到信息的 CRC码,比较计算得到的CRC码是否与接收到的相符,如果两者不相符,则表明出错。
CRC码的计算方法是,先预置16位寄存器全为1。再逐步把每8位数据信息进行处理。在进行CRC码计算时只用8位数据位,起始位及停止位,如有奇偶校验位的话也包括奇偶校验位,都不参与CRC码计算。
在计算CRC码时,8位数据与寄存器的数据相异或,得到的结果向低位移一字节,用0填补最高位。再检查最低位,如果最低位为1,把寄存器的内容与预置数相异或,如果最低位为0,不进行异或运算。
这个过程一直重复8次。第8次移位后,下一个8位再与现在寄存器的内容相相异或,这个过程与以上一样重复8次。当所有的数据信息处理完后,最后寄存器的内容即为CRC码值。CRC码中的数据发送、接收时低字节在前。
计算CRC码的步骤为:
预置16位寄存器为十六进制FFFF(即全为1)。称此寄存器为CRC寄存器;
把第一个8位数据与16位CRC寄存器的低位相异或,把结果放于CRC寄存器;
把寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位;
如果最低位为0:重复第3步(再次移位); 如果最低位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;
重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
重复步骤2到步骤5,进行下一个8位数据的处理;
最后得到的CRC寄存器即为CRC码。
3.功能码03,读取点和返回值:
仪表采用Modbus RTU通讯规约,利用通讯命令,可以进行读取点(“保持寄存器”) 或返回值(“输入寄存器” )的 *** 作。保持和输入寄存器都是16位(2字节)值,并且高位在前。这样用于仪表的读取点和返回值都是2字节。一次最多可读取寄存器数是60。由于一些可编程控制器不用功能码03,所以功能码03被用作读取点和返回值。从机响应的命令格式是从机地址、功能码、数据区及CRC码。数据区中的寄存器数据都是每两个字节高字节在前。
4.功能码06,单点保存
主机利用这条命令把单点数据保存到仪表的存储器。从机也用这个功能码向主机返送信息。

modbus通讯协议是一种工业自动化总线通信协议,其标准、开发和免费等特点,支持数千种工业智能仪器仪表厂家数据通信,同时支持多种通信接口RS232、RS85、TTL、光纤和无线等方式,协议公开、格式通俗易懂,广泛应用于多种工业自动化领域,作为该领域的无线通信设备厂家——为那…通信的WCTU设备,不仅兼容Modbus通讯协议,并且可以实现多种自主加密方式支持多种串口通信方式,并集成多路模拟量采集AD接口和IO控制接口,监护前端PLC+DTU功能,实现一体化,节约成本,灵活多用。

主站发送: 从机地址 功能码 电度对象起始地址H 电度对象起始地址L 电度对象数目H 电度对象数目L CRC码H CRC码L 01 03 00 00 00 01 85 B2 子站响应: 地址 功能码 字节数 正向有功电度
LSB MSB 反向有功电度
LSB MSB 正向无功电度
LSB MSB 反向无功电度
LSB MSB CRC码H CRC码L 01 03 10 E8 03 00 00 B6 07 00 00 B8 0B 00 00 A0 0F 00 00 B6 1B 正向有功电度值为:
0x000003E8(1000W/1kW) 反向有功电度
0x000007D0(2000W/2kW) 正向无功电度
0x00000BB8(3000Var/3kVar) 反向无功电度
0x00000FA0(4000Var/4kvar) 注意:
每个电度值由4个字节组成一个32位字,它的单位是W(瓦特)或Var(乏)报文中先收到的是电度的低位字节,后收到的是高位字节。例:========MMP-5000D读电度值========
TX:01 03 02 00 00 01 85 B2
RX:01 03 10 E8 03 00 00 D0 07 00 00 B8 0B 00 00 A0 0F 00 00 93 CD

我也正在研究这个威胜DTSD341,不过 你说的DL/T645好像是威胜系列表其中使用的一种标准协议,新出厂威胜支持MODBUS RTU协议,我手头没有这种表,但我用西门子200和另一种PD194-Z2S4的多功能电量表通讯了,是MODBUS RTU协议,没有问题,并且要是用OPC的话还能和西门子WINCC做成多台电量表在上位机集中监视,省掉抄表的麻烦。

采用功能码05H向线圈0x0000写数值0xFF00,产生单报文直接遥控合闸。慎用本命令!
主站发送: 从机地址 功能码 线圈地址H 线圈地址L 强制线圈数值H 强制线圈数值L CRC码H CRC码L 01 05 00 00 FF 00 8C 3A 子站响应: 从机地址 功能码 线圈地址H 线圈地址L 强制线圈数值H 强制线圈数值L CRC码H CRC码L 01 05 00 00 FF 00 8C 3A


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/13404715.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-29
下一篇 2023-07-29

发表评论

登录后才能评论

评论列表(0条)

保存