编号: ____________
密级:内部
页数:___________ 基于RS485接口的DGL通信协议(修改)
编写:_________________________
校对:_________________________
审核:_________________________
批准: ________________________
北京华美特科贸有限公司
二OO二年十二月六日
1. 前言
在常见的数字式磁致伸缩液位计中,多采用RS485通信方式。但RS485标准仅对物理层接口
进行了明确定义,并没有制定通信协议标准。因此,在RS485的基础上,派生出很多不同的协议,
不同公司均可根据自身需要设计符合实际情况的通信协议。并且,RS485允许单总线多机通信,如
果通信协议设计不好,就会造成相互干扰和总线闭锁等现象。如果在一条总线上挂接不同类型的产
品,由于协议不一样,很容易造成误触发,造成总线阻塞,使得不同产品对总线的兼容性很差。
随着RS485的发展,Modicon公司提出的MODBUS协议逐步得到广泛认可,已在工业领域得
到广泛应用。而MODBUS的协议规范比较烦琐,并且每字节数据仅用低4位(范围:0~15),在
信息量相同时,对总线占用时间较长。
DGL协议是根据以上问题提出的一种通信协议。在制定该协议时已充分考虑以下几点要求:
a. 兼容于MODBUS 。也就是说,符合该协议的从机均可挂接到同一总线上。
b. 要适应大数据量的通信。如:满足产品在线程序更新的需要(未来功能)。
c. 数据传输需稳定可靠。对不确定因素应加入必要的冗错措施。
d. 降低总线的占用率,保证数据传输的通畅。
2. 协议描述
为了兼容其它协议,现做以下定义:
通信数据均用1字节的16进制数表示。从机的地址范围为:0x80〜OxFD,即:MSB=1 ;
命令和数据的数值范围均应控制在0~0x7F之间。即:MSB=0,以区另【J地址和其它数据。
液位计的编码地址为:0x82~0x9F。其初始地址(出厂默认值)为:0x81。
罐旁表的编织地址为:0xA2~0xBF。其初始地址(出厂默认值)为:0xA1。
其它地址用于连接其它类型的设备,也可用于液位计、罐区表地址不够时的扩充。
液位计的命令范围为:0x01~0x2F,共47条,将分别用于参数设定、实时测量、诊断测试、在线编程等。
通信的基本参数为:4800波特率,1个起始位,1个结束位。字节校验为奇校验。本协议的数据包是参照MODBUS RTU通信格式编写,并对其进行了部分修改,以提高数据传输的速度。另外,还部分参
照了HART协议。其具体格式如下:
表中,数据的最大字节数为16个。也就是说,整个数据包最长为20个字节。
“校验和”是其前面所有数据异或得到的数值,然后将该数值MSB位清零,使其满足0~7F
的要求。在验证接收数据包的“校验和”是否正确时,可将所有接收数据(包括“校验和”)进行异或操作,得到的数据应= 0x80。这是因为,只有“地址”的MSB=1,所以异或结果的MSB也必然等于1。
本协议不支持MODBUS中所规定的广播模式。
3. 时序安排
在上电后,液位计将先延迟10秒,等待电源稳定。然后,用5秒的时间进行自检和测试数据。
接着产品进入待机状态并打开RS485通信接口,等待主机的请求。因此,主机应在液位计上电20
秒后,再将液位计置为工作状态,进行测量操作。
液位控制器(HMT-900或H-1000 )主要用于液位计的供电和防爆安全隔离。主机可通过
RTS 信号控制(HMT-900或H-1000)供给液位计的电源。当 RTS 有效时,电源将被打开。因此,液位 计的电源是可以通过主机软件控制的。
在现场应用中,主机软件的工作时序一般应遵循以下几个步骤。
1) 在开主机前,并认真检查各相关设备的电源和电缆连接情况。
2) 在启动主机软件时,打开相应串行端口。使能
RTS 信号,给液位计上电。 3) 软件初始化操作,延迟 20秒。
4) 读液位计的相应参数,然后将液位计置为工作状态。
5) 此时,主机可进入正常的轮训、记录、显示、报警等工作。
主机软件的主要工作是通过 RS485总线和各个液位计进行 DGL 格式的数据包通信。因此,通 信时序安排的好坏显得很重要。在本协议中, 主机只能有1个,并完全控制总线,任何从机在没有 主机请求时,必需保持接收状态。 在设计从机电路时, 应保证从机在上电时不能出现对总线的占用 (发送状态),哪怕是很短的时间。以免增加系统功耗,影响其“本质安全”性能。
虽然主机控制着总线, 但在总线空闲状态, 主机也应处于接收状态。 只有在向指定的从机发送 请求数据包时,才进入发送状态。主机的发送接收状态切换由其串口的
DTR 信号控制,可称为 MDTR 。同样,从机也有一个控制信号,称为
SDTR 。当主机 DTR 无效(转换成TTL 电平,MDTR 为高电平)时,端口处于发送状态。当 DTR 有效(MDTR 为低电平)时,端口处于接收状态。据此, 可绘
制出数据包传输的时序图如下:
SDTR
---------------------------------- 应答数据包 -----------
时刻: T1 T2 T3 T4 T5 T6 T7 T8
在T1时刻,主机将 MDTR 置为高电平(DTR 无效),准备发送数据。T2时刻,主机发送“请 求数据包”。当数据包发送完成(T3时刻)后,随即要将MDTR 变为低电平(T4时刻),释放总线,等 待接收“应答数据包”。
在相应从机(液位计)接收到正确的“请求数据包”后,就开始准备“应答数据包”
。经延时, 在T5时刻,从机将 SDTR 置为高电平,控制总线。然后,在
T6时刻发送数据包。发送完成
(T7 时刻)后,随即将SDTR 置为低电平,释放总线。这样一次数据包通信就完成了。 对以上各时刻的时序要求可以描述为:
T2-T1=1.9~3.5ms, T3-T2=10~60ms, T4-T3=1~3.5ms, T5-T3=8~18ms, T6-T5=1.9~3.5ms, T7-T6=10~60ms, T8-T7=1~3.5ms 。一次通信的最长时间将控制在 160ms 以内。两次数据包通信的间隔应》
20ms 。 根据以上描述和规定,我们就可以精确地进行主机和从机的通信控制。
并根据可能出现的各种 通信错误和故障,进行冗错设计。
4. 命令定义
命令0x01 通信协议识别码 请求数据:Obyte
MDTR
请求数据包
应答数据:3byte 字符串“ DGL ” 44,47,4C
命令0x02 地址更改
请求数据:1byte NewAdr-0x80
应答数据:1byte NewAdr-0x80 注:
应答数据中仍保留为原来地址不变
命令0x03, 0x4 保留
命令0x05 读厂家名请求数据:0byte 应答数据:10byte 字符串“ ALMRT Ltd. ”
命令0x06 读产品类型请求数据:0byte 无应答数据:8byte DT0~7
浮子数温度测点外管类型测杆材料安装形式防爆类型x x
命令0x07 读产品杆长请求数据:0byte 无应答数据:2byte DT0 ,DT1
基数:2mm,范围:w 20m, GL= (DT1*128+DT0)*2mm
命令0x08 读温度测点位置请求数据:0byte 应答数据:5byte DT0~4 对应于VT1~5 位置相对杆长的百分数( 0~99)
命令0x09 读产品序列号请求数据:0byte 无
应答数据:4byte 具体待定,存于MCU EEPROM 中。
命令0x0A 读电路和程序的版本号请求数据:0byte
应答数据:2byte DT0 电路版本,DT1 程序版本
命令0x0B 读零点校准参数数据请求数据:0byte 应答数据:8byte DT0~7
Level1Zero=((DT2*128+DT1)*128+DT0)*0.01mm DT3<>0, 数据求反
Level2Zero=((DT6*128+DT5)*128+DT4)*0.01mm DT7<>0, 数据求反
命令0x0F 设置产品工作状态
请求数据:1byte DT0=0 ,产品工作;DT0<>0 ,产品待机;
应答数
据:
1byte 和请求数据相同。命令0x10 读液位1( Level1 ,油面)数据
请求数据:0byte
应答数据:3byte DT0, DT1, DT2
分辨率:0.01m m,范围:30mm〜20m(0x1E8480, DT2=7A, DT1=09, DT0=0)。当DT2=DT1=DT=0
时,液位下溢出;当DT2=DT1=DT=7F 时,液位上溢出;Level1=((DT2*128+DT1)*128+DT0)*0.01mm
命令0x11 读液位2 ( Level2,界面)数据
请求数据:0byte
应答数据:3byte DT0, DT1, DT2
Level2=((DT2*128+DT1)*128+DT0)*0.01mm
命令0x12 读两个液位数据
请求数据:0byte 应答数据:6byte DT0, DT1, DT2, DT3, DT4, DT5
Level1=((DT2*128+DT1)*128+DT0)*0.01mm
Level2=((DT5*128+DT4)*128+DT3)*0.01mm 建议:如需读液面2 的数据时,应采用该命令。这样,可同时得到液位 1 的值,
提高了通信速度。
命令0x13〜0x14 保留
命令0x15 读各测杆测点温度( 只有一个温度测点)
请求数据:0byte
应答数据:10byte DT0〜9
分辨率(刻度):KD=0.015625 °C (2A-6), 范围:-56〜130 C
VT1=(DT1*128+DT0)*KD-56 ,VT2=(DT3*128+DT2) *KD-56 ,,,
命令0x16 保留
从以上协议可知,每个通信数据都用1Byte 的16 进制数表示,数据包中的地址( ADDRESS ) 字段长度为1Byte,当HT-1000(主机)向uPSD3200(从机)发送数据时,数据包中的地址(ADDRESS ) 字段中MSB 应为1,因为此时数据包要到达的地址是从机,从机的地址范围为:0x80〜0xFD,即:MSB=1。主机(HT-1000)没有地址(也许理论上应该有),主从机通信过程是这样的:主机不断发出4 个字节的数据包(地址,命令,字节数,校验和)去查询从机的测量情况,其中字节数为0,则
没有数据字节,只需 4 个字节就可构成一个数据包。如下:
81 16 00 17
88 16 00 1E
84 16 00 12
87 16 00 11
8F 16 00 19
以上 5 个数据包就是主机发往从机的数据包,第一个字节是地址,共有 5 个地址,即发往5
个从机,每发一个数据包,主机会等待从机的回应,然后再发下一个数据包,如果等待超时,则认为通信错误
( HT-1000 上会显示XX 号罐通信错误) 。若有回应,则主机进行数据处理,在友好的人机界面上显示相关测量信息。第二个字节16 是命令字, 16 的具体含义可查询具体命令字信息。第三个00代表数据位是零个, 第四个字节是校验和。 (这里设计协议的原则是尽可能是通信的字节数变少,减少信息在传输过程中的丢失,当然也要考虑扩展性)
一个回应的数据包如下:
88 16 08 69 7F 05 7A 3A 02 23 27 43
共12 个字节,再根据字段分一下:
88 16 08 69 7F 05 7A 3A 02 23 27 43
第一个字节88 是从机的地址,由于主机采用“发送---等待回应”方式来和从机通信,并且目前只有一个主机,因此,从机发送的数据包中的地址不必是主机地址(除非有多个主机,在理解协议数据包时,数据包中的地址字段应当是发往目的地的地址,但事实上从机回应数据包中的地址是本身的地址,不是目的地主机的地址),只需标明自身的地址即可,相当于“这里是XX 号从机在回答--- ”。第二个字节16 是命令字。第三个字节08表示数据段有8个字节,接下来的8个字节是数据信息,前三个字节69 7F 05是油位测量值(69是数据的最低数值,7F是次低的数值,05是数据的高位数值),接着三个字节7A 3A 02 是水位测量值,数据信息最后两个字节23 27 是温度测量值,最后一个字节43 是校验和。
通信协议0x16 是DGL 协议里的一条命令,表示取得探棒的油位,水位和温度
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论