用户名:  密码: 登录 注册zuozhuan2009 主页博客相册|个人档案|好友|i贴吧  查看文章   
基于串口的Modbus软件2011-06-16 14:18基于串口的Modbus软件开发
----------------------八股--------------------
1、已经有好多个测试软件了,但是没有开源。如modbusscan 7.),Modbus Poll version, 4.3.1, ,ModLink,ModbusSimulator
2、协议比较老了,但是很管用。
----------------------八股----qin yufei blog---------
----------------------N步走----qin yufei blog--------
第一步:图书馆借N本VC串口编程的书
第二步:上网下N个源代码
第三步:上网下个虚拟串口的程序。(www.sudt/cn/sn/download.htm)
第四步:学习Modbus协议
主从方式,主站初始化传输。从站根据主设备查询提供的数据作出反应。
主站查询格式:站(或广播)地址、功能代码、要发送的数据、错误检测域。
从站回应格式:确认要行动的域、返回的数据、错误检测域。如果在消息接收过程中发生错误,或从站不能执行其命令,从站将建立错误消息并把它作为回应发送出去。
从站地址是0...247,0为广播地址
ASCII模式
地址
功能代码
数据数量
数据1
...
数据n
LRC高字节
LRC低字节
回车
换行
 代码系统:
十六进制,ASCII字符0...9,A...F
消息中的每个ASCII字符都是一个十六进制字符组成
每个字节的位:
1个起始位
7个数据位,最小的有效位先发送
1个奇偶校验位,无校验则无
1个停止位(有校验时),2个Bit(无校验时)
错误检测域
LRC(纵向冗长检测)
 使用ASCII模式,消息以冒号(:)字符(ASCII码 3AH)开始,以回车换行符结束(ASCII码 0DH,0AH)。
 其它域可以使用的传输字符是十六进制的0...F。网络上的设备不断侦测“:”字符,当有一个冒号接收到时,每个设备都解码下个域(地址域)来判断是否发给自己的。
 消息中字符间发送的时间间隔最长不能超过1秒,否则接收的设备将认为传输错误。
RTU模式
地址
功能代码
数据数量
数据1
...
数据n
CRC低字节
CRC高字节
 
 
代码系统:
8位二进制,十六进制数0...9,A...F
消息中的每个8位域都是一个两个十六进制字符组成
每个字节的位:
1个起始位
8个数据位,最小的有效位先发送
1个奇偶校验位,无校验则无
1个停止位(有校验时),2个Bit(无校验时)
错误检测域
CRC(循环冗长检测)
深入理解ModBus功能码
Modbus主要功能码
功能码
名称
注释
01
Read Coil Status
(线圈状态0x)(读PLC的开出状态)     
bit 读位    ,与5对应, 可读可写DO
02
Read Input Status
(输入状态1x) (读PLC的开入状态)     
bit 读位,只读DI
03
Read Holding Register
(保持寄存器4x HR) (读模出状态)
读整形、状态字、浮点型、字符型,与16对应
04
Read Input Register
(输入寄存器3x AR) (读PLC模入状态) 
读整形、状态字、浮点型 只读AI
05
Write Single Coil
(强制单路开出,给PLC写数据)
写单个位  可读可写DO
06
Write Single Register
(强制单路模出,给PLC写数据)
写单个整形、状态字、浮点型、字符型,写HR4x的地址区
15
Write Multiple Coil
(强制多路开出,给PLC写数据)
写多个位
16(0x10H)
Write Multiple Register
(强制多路模出,给PLC写数据)
写多个整形、状态字、浮点型、字符型
15和16可能是用于一次写一串数据的,不允许单个写。如时间的世纪、年、月、日、时、分、秒要一次写下去
设备和Modbus 地址范围对应表
设备地址
Modbus地址
描述
功能
R/W
1...10000*
address - 1
Coils (outputs)
0
Read/Write
20000*
address - 10001
Discrete Inputs
01
Read
50000*
address - 40001
Holding Registers
03
Read/Write
40000*
address - 30001
Input Registers
04
Read
*最大值与设备相关
注:设备地址是从1开始的,所以Modbus写入地址要在设备地址上减1。
协议格式
功能码:01 (线圈状态0x)(读开出状态) 
        例:从4站读10…22(Coil 11…23),从A开始,共D(13)个数据
从站地址
功能码
H 地址
L 地址
H Coils
L Coils
CRC
04
01
00
0A
00
0D
DD
98
主站
从站地址
功能码
字节数
Coils 7..10
Coils 27..20
CRC
          04
01
02
0A
11
50
B3
从站
功能码:02 (输入状态1x) (读开入状态)
        例:从4站读10…22(Input 10011…10023),从A开始,共D(13)个数据
从站地址
功能码
H 地址
L 地址
H Input
L Input
CRC
04
02
00
0A
00
0D
99
98
主站
从站地址
功能码
字节数
Input 7..10
Input 27..20
CRC
          04
02
02
0A
11
14
B3
从站
功能码:03 (保持寄存器4x HR) (读模出状态)
        例:从1站读0…1(寄存器 40001…40002),共2个数据
从站地址
功能码
H 地址
L 地址
H 数据
L 数据
CRC
01
03
00
00
00
02
C4
0B
主站
从站地址
功能码
字节数
H数据
L数据
H数据
L数据
CRC
          01
03
04
00
06
00
05
DA
31
从站
功能码:04 (输入寄存器3x AR) (读模入状态) 
        例:从1站读0…1(寄存器 30001…30002),共2个数据
从站地址
功能码
H 地址
L 地址
H 数据
L 数据
CRC
01
04
00
00
00
02
71
CB
主站
从站地址
功能码
字节数
H数据
L数据
H数据
L数据
CRC
          01
04
04
00
06
00
05
DB
86
从站
功能码:05 强制单路开出,给PLC写数据
        例:给17站173单线圈写ON
从站地址
功能码
H 地址
L 地址
H 数据
L 数据
CRC
11
05
00
AC
FF
00
4E
8B
主站
注:写0xFF00表示ON,写0x0000表示OFF
从站地址
功能码
H 地址
L 地址
H数据
L数据
CRC
          11
05
00
AC
FF
00
4E
8B
从站
注:返回帧与主站相同
功能码:06 强制单路模出,给PLC写数据
        例:给17站40002变量写0x00 03H。帧的地址是0x0001H
从站地址
功能码
H 地址
L 地址
H 数据
L 数据
CRC
11
06
00
01
00
03
9A
9B
主站
从站地址
功能码
H 地址
L 地址
H数据
L数据
CRC
          11
06
00
01
00
03
9A
9B
从站
注:返回帧与主站相同
功能码:15 强制多路开出,给PLC写数据
        例:给17站从20号线圈开始的10个单线圈写ON,MB地址:20-1=19=0x13H
    数据:
帧中位
1   
0 
0 
1 
1 
0 
1 
0
0
0
0
0
0
0
1
位置
7
6
5
4
3
2
1
0
15
14
13
12
11
10
9
8
本例位置
起始位为20
27
26
25
24
23
22
21
20
-
-
-
-
-
-
29
28
从站地址
功能码
H 地址
L 地址
H线圈数量
L线圈数量
字节数
H数据
L数据
CRC
11
0F
00
13
00
0A
02
CD
01
BF
0B
主站
从站地址
功能码
H 地址
L 地址
H线圈数量
L线圈数量
CRC
          11
05
00
13
00
0A
4E
reactor软件
8B
从站
注:变量写的从站反馈没有数据
功能码:16 强制多路模出到保持寄存器,给PLC写数据
    每个寄存器的数据为2个字节。     
例:给17站从40002HR开始的2个寄存器,数据为000A和0102,MB地址:40002-1=40001=MB1
   
从站地址
功能码
H地址
L地址
H模入数量
L模入数量
字节数
H
数据1
L
数据1
H
数据2
L
数据2
CRC
11
10
00
01
00
02
04
00
0A
01
02
C6
F0
主站
从站地址
功能码
H 地址
L 地址
H线圈数量
L线圈数量
CRC
          11
10
00
01
00
02
12
98
从站
注:变量写的从站反馈没有数据
秦批:Modbus的从站反馈数据没有数据帧的编号(不像TCP协议那样),所以不会显示这个反馈数据是主站的哪次请求的。若主站一次发送N个数据,从站而没有及时反馈,这样就乱了,主站就不知道从站发过来的数据是哪次命令的。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。