加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

西门子plc200学习笔记 第三课 S7-200作为从站与主站51单片机Modbus RTU通讯

(2017-06-05 10:17:34)
标签:

it

教育

分类: s7-200学习笔记

西门子plc200学习笔记

第三课 S7-200作为从站与主站51单片机Modbus RTU通讯

一、Modbus协议简介

S7-200 CPU上的通信口Port0支持Modbus RTU协议。要实现Modbus RTU通信,需要STEP 7-Micro/WIN32 V3.2以上版本的编程软件,而且须安装STEP 7-Micro/WIN32 V3.2 Instruction Library(指令库)。Modbus RTU功能是通过指令库中预先编好的程序功能块实现的。

Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为通用工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。

 

协议用于主从查询模式,进行数据通讯。此协议定义了控制器能认识使用的消息结构,结构形式如下所示:

http://s9/mw690/0068KRmqzy7bCVkuwOcd8&690第三课 S7-200作为从站与主站51单片机Modbus RTU通讯" TITLE="西门子plc200学习笔记 第三课 S7-200作为从站与主站51单片机Modbus RTU通讯" />

常用的功能码如下:

代码

名称

作用

01

读取线圈状态

取得一组逻辑线圈的当前状态(ON/OFF) ,功能 01 返回任意个数输出点(Q)的 ON/OFF 状态。

02

读取输入状态

取得一组开关输入的当前状态(ON/OFF),功能 02 返回任意个数输入点(I)的 ON/OFF 状态。

03

读取保持寄存器

读取单个/多个保持寄存器。功能 03 返回 V 存储区的内容。在 Modbus 协议下保持寄存器都是""值,在一次请求中可以读取最多 120 个字的数据。

04

读取输入寄存器

读取单个/多个输入寄存器。功能 04 返回 S7-200 的模拟量数据值。

05

强置单线圈

写单个线圈(离散量输出点)。功能0 5 用于将离散量输出点设置为指定的值。这个点不是被强制的,用户程序可以覆盖 Modbus 通信请求写入的值。

06

预置单寄存器

写单个保持寄存器。功能 06 写一个值到 S7-200 V 存储区的保持寄存器中。

07

读取异常状态

取得8个内部线圈的通断状态

15

强置多线圈

写多个线圈(离散量输出点)。功能 15 把多个离散量输出点的值写到 S7-200 的输出映像寄存器(Q 区)。输出点的地址必须以字节边界起始(如 Q0.0 Q2.0),并且输出点的数目必须是 8 的整数倍。这是此 Modbus RTU 从站指令库的限制。些点不是被强制的,用户程序可以覆盖 Modbus 通信请求写入的值。

16

预置多寄存器

写多个保持寄存器。功能 16 写多个值到 S7-200 V 存储区的保持寄存器中。在一次请求中可以写最多 120 个字的数据。

17

报告从机标识

可使主机判断编址从机的类型及该从机运行指示灯的状态

举例说明:主机要从17号从机读3个采集到的基本数据U1U2U3U1的地址为0000H, U2的地址为0001HU3的地址为0002H。主机发送的命令格式是:110300000003075B

其中1116进制数表示的地址是17号从站,03表示查询命令,0000是查询的寄存器起始地址,0003是要查询的寄存器末地址,075BCRC校验值。

当主机的信息帧到达终端设备时,从机读取数据,如果没有错误,就执行数据所请求的任务,然后,它将自己生成的数据帧返回给主机。返回的响应数据中包含了以下内容:终端从机地址(Address)、被执行了的命令(Function)、执行命令生成的被请求数据(Data)和校验码(Check)。如上例中主机发送110300000003075B,从机响应格式是:11030603E803E703E9FD9C,其中11是地址(16进制数),03是功能码,06是返回的字节数,03E803E703E9(U1=03E8H,U2=03E7H,U3=03E9H)是返回的6个字节数据,FD9CCRC校验码。

另一个例子是请求17号从机0040H的值为2717。主机发送命令:110600400A9D4D87

其中11是地址,06是功能码(预设单寄存器),0040是寄存器地址,0A9D是数据,等于十进制的27174D87CRC校验码。从机对于预置单寄存器请求的正常响应是在寄存器值改变以后将接收到的数据传送回去。从机返回的数据是:110600400A9D4D87

例如单片机作为主机要读s7-200V存储区数据,需要发送0C0300320004E4DB读取保持寄存器(功能码03)此例是要在12号从机的存储区起始地址是0032h地址读4个数据,返回8个字节。0C03080092009200000000A46F,若要读PLC输入状态(功能码02),发送0C0200000001返回0C02010162E4,若要读PLC的输出状态(功能码01),发送0C0100000001返回0C01010192E4

 

二、51单片机作为主机读写S7-200数据的程序

在主程序中调用下面子程序即可。

51单片机读PLC输入状态I0.0的子程序如下:

FFJ02:    MOV B,#10H          ;PLC输入状态I0.0

FJ4:      MOV 2DH,#0CH          ;地址;;;;;;;;;;;;

          MOV 2EH,#02H        ;功能码02h

          MOV 2FH,#00H        ;起始开关量地址

          MOV 30H,#00H        ;起始寄存器地址

          MOV 31H,#00H        ;寄存器个数,最多25

          MOV 32H,#01H

          ORL AUX,#80H        ;p1.6p1.7当串口

          CLR EA

          SETB P3.7

          MOV CRCCD,#06H

          LCALL CRC

          MOV R2,#08H

          MOV R0,#2DH;2CH

FJ1:       MOV SBUF,@R0

          JNB TI,$

          CLR TI

          INC R0

          DJNZ R2,FJ1

          LCALL PDOK1   ;读返回的DI,DO

          JNZ FJ0      ;如果没有检测到OK,重复发

          CALL DELAY

          DJNZ B,FJ4

FJ0:       SETB FLAG_1

          SETB EA

          RET

51单片机读V存储区数据的子程序如下:

 

FFJ03:    MOV B,#10H          ;'V存储区数据    

FJ7:      MOV 2DH,#0CH        ;地址

          MOV 2EH,#03H        ;功能码03h

          MOV 2FH,#00H        ;起始寄存器地址高位

          MOV 30H,#32H        ;起始寄存器地址低位

          MOV 31H,#00H        ;寄存器个数,最多25

          MOV 32H,#04H

          ORL AUX,#80H        ;p1.6p1.7当串口

          CLR EA

          SETB P3.7

          MOV CRCCD,#06H

          LCALL CRC

          MOV R2,#08H

          MOV R0,#2DH

                 AJMP FJ1

51单片机读S7-200输出状态Q0.0的子程序如下:

FFJ033:    MOV B,#10H          ;'Q状态

FJ9:      MOV 2DH,#0CH          ;地址;;;;;;;;;;;;

          MOV 2EH,#01H        ;功能码02h

          MOV 2FH,#00H        ;起始开关量地址

          MOV 30H,#00H        ;起始寄存器地址

          MOV 31H,#00H        ;寄存器个数,最多25

          MOV 32H,#01H

          ORL AUX,#80H        ;p1.6p1.7当串口

          SETB P3.7

          CLR EA

          MOV CRCCD,#06H

          LCALL CRC

          MOV R2,#08H

          MOV R0,#2DH

AJMP FJ1

 

PDOK1:          MOV R0,#35H

                MOV R2,#11D

                CLR P3.7

                SETB REN

FXL2:           CLR RI                   ;软件清除串口中断标记

                LCALL PDRI1              ;等待下一个串口数据

                MOV A,SBUF              ;将串口寄存器中接收到de数据给A

                MOV @R0,A

                INC R0

                DJNZ R2,FXL2

                MOV R0,#0C0H           

                CLR RI                   ;软件清除串口中断标记

                LCALL PDRI1              ;等待下一个串口数据

                MOV A,SBUF              ;将串口寄存器中接收到de数据给A

                MOV @R0,A               ;CRC存放首址

                INC R0

                CLR RI                   ;软件清除串口中断标记

                LCALL PDRI1              ;等待下一个串口数据

                MOV A,SBUF              ;将串口寄存器中接收到de数据给A

                MOV @R0,A              ;CRC校验码第二字节

                MOV R0,#35H             ;对发来的数据进行CRC校验,

                MOV CRCCD,#11D;

                LCALL CRC1

                MOV R0,#0C0H            ;AAH-ABH存放下位机发来的CRC校验码

                MOV A,@R0               ;CRC校验码首字节

                CJNE A,06H,SB1            ;CRC校验码首地址 06H=R6

                INC R0

                MOV A,@R0                ;CRC校验码第二字节

                CJNE A,07H,SB1             ;07H=R7

                MOV A,#0FFH              ;检测到OK,A1

                AJMP SB2

SB1:            CLR A                     ;没有检测到OK,A清零

SB2:            CLR RI                     ;清除有串口数据标志

                SETB EA

                RET

一、S7-200程序

1、  安装Modbus协议库

 

下载Modbus协议库,打开目录,点击http://s14/bmiddle/0068KRmqzy7bCVpo8C90d&690第三课 S7-200作为从站与主站51单片机Modbus RTU通讯" /> 进行安装。

http://s11/mw690/0068KRmqzy7bCVryf0Kea&690第三课 S7-200作为从站与主站51单片机Modbus RTU通讯" TITLE="西门子plc200学习笔记 第三课 S7-200作为从站与主站51单片机Modbus RTU通讯" />

安装成功后左侧浏览条的“库”中如下图:

http://s14/mw690/0068KRmqzy7bCVrMmcZ8d&690第三课 S7-200作为从站与主站51单片机Modbus RTU通讯" TITLE="西门子plc200学习笔记 第三课 S7-200作为从站与主站51单片机Modbus RTU通讯" />

2S7-200程序

S7-200程序如下图,首先调用MBUS_INIT模块,初始化有关参数,如波特率,奇偶校验等要与主机一致。每一项的含义如下所示:

http://s13/mw690/0068KRmqzy7bCVtAmNSfc&690第三课 S7-200作为从站与主站51单片机Modbus RTU通讯" TITLE="西门子plc200学习笔记 第三课 S7-200作为从站与主站51单片机Modbus RTU通讯" />

Mode:       模式选择,启动/停止MODBUS1=启动;0=停止

Address:     从站地址,MODBUS从站地址,取值1~247

Baud:       波特率,可选1200240048009600192003840057600115200

Parity:       奇偶校验,0=无校验;1=奇校验;2=偶校验

Delay:       延时,附加字符间延时,缺省值为0

MaxIQ:      最大I/Q位,参与通信的最大I/O点数,S7-200I/O映像区为128/128,缺省值为128

MaxAI:       最大AI字数,参与通信的最大AI通道数,可为1632

MaxHold:     最大保持寄存器区,参与通信的V存储区字(VW

HoldStart:    保持寄存器区起始地址,以&VBx指定(间接寻址方式)

 

Done:        初始化完成标志,成功初始化后置1

Error:        初始化错误代码

 

在本例子中,设置从站地址为3

Port0 通讯波特率为9600

无校验

可以使用的S7-200最大数字量输入输出点数为128

可以使用的S7-200最大模拟量输入寄存器字数为32

可以使用的V区寄存器地址字数为100 起始地址为VB1000

SM0.0s7-200的特殊寄存器,RUN监控,PLC在运行状态时,SM0.0总为ON

本程序初始化完成后,还调用了MBUS_SLAVE子程序,它属于协议库的一部分。此程序是加密的。如下图左面有一个锁,在“查看”选属性后会弹出密码保护如下图。

http://s2/mw690/0068KRmqzy7bCVyssAp61&690第三课 S7-200作为从站与主站51单片机Modbus RTU通讯" TITLE="西门子plc200学习笔记 第三课 S7-200作为从站与主站51单片机Modbus RTU通讯" />

http://s6/mw690/0068KRmqzy7bCVyFD4955&690第三课 S7-200作为从站与主站51单片机Modbus RTU通讯" TITLE="西门子plc200学习笔记 第三课 S7-200作为从站与主站51单片机Modbus RTU通讯" />

http://s12/mw690/0068KRmqzy7bCVyYeUP1b&690第三课 S7-200作为从站与主站51单片机Modbus RTU通讯" TITLE="西门子plc200学习笔记 第三课 S7-200作为从站与主站51单片机Modbus RTU通讯" />

注意:本例子中,Modbus RTU 从站指令使用的库存储为VB0---VB779,这段寄存器地址不能再被程序中的任何指令使用,包括MBUS_INIT MBUS_SLAVE 指令在内。


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有