怎么开发驱动程序 点击:1429 | 回复:4



wtf501

    
  • 精华:0帖
  • 求助:1帖
  • 帖子:9帖 | 122回
  • 年度积分:0
  • 历史总积分:32
  • 注册:2009年6月22日
发表于:2009-07-04 15:03:20
楼主

由于开物里没有该仪表的驱动程序,请问自己怎么做该仪表的驱动?能否举例说明。附该仪表通讯协议

3. 数据帧格式:
通讯传输为异步方式,并以字节(数据帧)为单位。在主站和子站之间传递的每一个数据帧都是11位的串行数据流。

数据帧格式:
起始位 1位
数据位 8位(低位在前、高位在后)
奇偶校验位 1位:有奇偶校验位;无:无奇偶校验位
停止位 1位:有奇偶校验位;2位:无奇偶校验位
有校验位的时序图:



无校验位的时序图:



4. P-230通讯规约
当通讯命令发送至仪器时,符合相应的地址码的设备接收通讯命令,并除去地址码,读取信息,如果没有出错,则执行相应的任务;然后把执行结果返送给发送者。返送的信息中包括地址码、执行动作的功能码、执行动作后的数据以及错误校验码(CRC)。如果出错就不发送任何信息。
4.1. 信息帧格式

START ADD CS DATA CRC END
初始结构 地址码 功能码 数据区 错误校验 结束结构

延时(相当于4个字节的时间) 1字节
8位 1字节
8位 N字节
N×8位 2字节
16位 延时(相当于4个字节的时间)

4.1.1. 地址码(ADD)
地址码为每次通讯传送的信息帧中的第一个数据帧(8位),从0到255。这个字节表明由用户设定地址码的子机将接收由主机发送来的信息。并且每个子机都有唯一的地址码,并且响应回送均以各自的地址码开始。主机发送的地址码表明将发送到的子机地址,而子机发送的地址码表明回送的子机地址。

4.1.2. 功能码(CS)
功能码是每次通讯传送的信息帧中的第二个数据帧。ModBus通讯规约定义功能码为1~127(01H~7FH)。P-230利用其中的一部分功能码。作为主机请求发送,通过功能码告诉子机执行什么动作。作为子机响应,子机发送的功能码与主机发送来的功能码一样,并表明子机已响应主机进行操作。如果子机发送的功能码的最高位是1(功能码>127),则表明子机没有响应或出错。
下表列出的功能码都具体的含义及操作。
MODBUS部分功能码
功能码 定义 操作
03H 读寄存器 读取一个或多个寄存器的数据
06H 写单个寄存器 把一个16位二进制数写入单个寄存器

1、 03,读寄存器
P-230智能表采用ModBus通讯规约,利用通讯命令,可以进行读取点(保持寄存器或返回值输入寄存器)。功能码03H映射的数据区的保持和输入寄存器值都是16位(2字节)。这样从P-230读取的寄存器值都是2字节。一次最多可读取寄存器数是125。由于一些可编程控制器不用功能码03,所以功能码03被用作读取点和返回值。
子机响应的命令格式是子机地址、功能码、数据区及CRC码。数据区的数据都是每2个字节为一组的双字节数,且高字节在前。
2、 06,写单个寄存器:
主机利用这条命令把单点数据保存到P-230智能电力监测仪的存储器。子机也用这个功能码向主机返送信息。
3、 10,写多个点连续寄存器:
主机利用这条命令把多点数据保存到P-230系列数字式多功能电力监测仪的存储器。Modbus通讯规约中的寄存器指的是16位(即2字节),并且高位在前。这样P-230智能电力监测仪的点都是二字节。用一条命令保存的最大点数取决于子机。因为Modbus通讯规约允许最多保存60个寄存器,这样P-230系列智能电力监测仪允许一次最多可保存60个寄存器。P-230智能电力监测仪的命令格式是子机地址、功能码、数据区及CRC码。

4.1.3. 数据区(DATA):
数据区随功能码不同而不同。由主机发送的读命令(03H)信息帧的数据区与子机应答信息帧的数据区是不同的,由主机发送的写命令(06H、10H)信息帧的数据区与子机应答信息帧的数据区是完全相同。数据区包含需要子机执行什么动作或由子机采集的需要回送的信息。这些信息可以是数值、参考地址等等。例如,功能码告诉子机读取寄存器的数值,则数据区必须包含要读取寄存器的起始地址及读取长度(寄存器个数)。

1、 与功能码03对应的数据区格式:
 主机发送
数据顺序 1 2
数据含义 起始地址 读寄存器个数
字节数 2 2

 子机应答
数据顺序 1 2
数据含义 回送字节数 N个寄存器的数据
字节数 1 2×N

2、 与功能码06对应的数据区格式:
数据顺序 1 2
数据含义 起始地址 写入寄存器的数据
字节数 2 2

3、 与功能码10对应的数据区格式:
数据顺序 1 2 … N
数据含义 起始地址 写入数据1 … 写入数据N
字节数 2 2 … 2

4.1.4. 错误校验码(CRC):
主机或子机可用校验码进行判别接收信息是否出错。有时,由于电子噪声或其他一些干扰,信息在传输过程中会发生细微的变化,错误校验码保证了主机或子机对在传送过程中出错的信息不起作用。这样增加了系统的安全和效率。错误校验码采用CRC-16校验方法。
二字节的错误校验码,低字节在前,高字节在后。
注意: 信息帧的格式都是相同的:地址码、功能码、数据区和错误校验码。
4.2. 错误校验
冗余循环码(CRC)包含2个字节,即16位二进制。CRC码由发送端计算,放置于发送信息的尾部。接收端的设备再重新计算接收到信息的CRC码,比较计算得到的CRC码是否与接收到的相符,如果二者不相符,则表明出错。
CRC码的计算方法是,先预置16位寄存器全为。再逐渐把每8位数据信息进行处理。在进行CRC码计算时只用8位数据位,起始位及停止位,如有奇偶校验位的话也包括奇偶校验位,都不参与CRC码计算。
在计算CRC码时,8位数据与寄存器的数据相异或,得到的结果向低位移一位,用0填补最高位。再检查最低位,如果最低位为1,把寄存器的内容与预置数相异或,如果最低位为0,不进行异或运算。
这个过程一直重复8次。第8次移位后,下一个8位再与现在寄存器的内容相异或,这个过程与上以上一样重复8次。当所有的数据信息处理完后,最后寄存器的内容即为CRC码值。
4.3. CRC-16码的计算步骤
1、 置16位寄存器为十六进制FFFF(即全为1)。称此寄存器为CRC寄存器。
2、 把一个8位数据与16位CRC寄存器的低位相异或,把结果放于CRC寄存器。
3、 把寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位(移出位)。
4、 如果最低位为0:复第3步(再次移位)。
如果最低位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或。
5、 重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理。
6、 重复步骤2到步骤5,进行下一个8位的处理。
7、 最后得到的CRC寄存器即为CRC码,低字节在前,高字节在后。

4.4. 信息帧格式举例
4.4.1. 功能码03
子机地址为01,起始地址0032的3个寄存器。
此例中寄存器数据地址为:
地 址 数据(16进制)
0032 EA60
0034 C350
0036 DB6C

主机发送 字节数 举 例(16进制)
子机地址 1 01 送至子机01
功能码 1 03 读取寄存器
起始地址 2 00 起始地址为0032
32
读取个数 2 00 读取3个寄存器(共6字节)
03
CRC码 2 A4 由主机计算得到的CRC码
04

子机响应 字节数 举 例(16进制)
子机地址 1 01 送至子机01
功能码 1 03 读取寄存器



楼主最近还看过



叶勺

  • 精华:0帖
  • 求助:0帖
  • 帖子:37帖 | 28回
  • 年度积分:0
  • 历史总积分:145
  • 注册:2008年4月10日
发表于:2009-07-21 14:28:50
1楼

ModBus的协议,在开物里建立其他设备中的 ModBus RTU 的设备

叶勺

  • 精华:0帖
  • 求助:0帖
  • 帖子:37帖 | 28回
  • 年度积分:0
  • 历史总积分:145
  • 注册:2008年4月10日
发表于:2009-07-21 14:28:53
2楼

onionzq

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 19回
  • 年度积分:0
  • 历史总积分:27
  • 注册:2008年3月28日
发表于:2009-07-27 09:47:32
3楼

对问题描述的内容好多难以看懂啊,关注中,

写驱动看是基于哪方面的应用,是基于以太网还是其它的,

可以使用Modbus、Modbut TCP(研究中。。。)

ysy938ysy

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 44回
  • 年度积分:0
  • 历史总积分:108
  • 注册:2017年4月26日
发表于:2018-12-19 11:14:48
4楼

谢谢楼主分享这么好的资料


热门招聘
相关主题

官方公众号

智造工程师