本节主要完成PLC作主站,51单片机作从站,用ModBus协议进行通讯。PLC读取单片机保持寄存器区的数据。S7-200PLC程序主要通过调用Modubs RTU 主站指令库完成。 一、调用 Modbus RTU 主站初始化和控制子程序 使用 SM0.0 调用 MBUS_CTRL 完成主站的初始化,并启动其功能控制: 各参数意义如下:
二、调用 Modbus RTU 主站读写子程序MBUS_MSG,发送一个Modbus 请求; 各参数意义如下: 常见的错误: 如果多个 MBUS_MSG 指令同时使能会造成 6 号错误库存储区被程序其它地方复用,有时也会造成6 号错误从站 delay 参数设的时间过长会造成主站 3 号错误从站掉电或不运行,网络故障都会造成主站 3 号错误。 三、需要从站支持的功能及Modbus 保持寄存器地址映射 为了支持上述 Modbus 地址的读写,Modbus Master 协议库需要从站支持下列功能: 需要从站支持的功能
Modbus 保持寄存器地址映射举例: 四、S7-200PLC程序 五、单片机程序;STC11F04E单片机,9600波特率 START: MOV TMOD,#21H ;定时器1是8位再装入,定时器0为16位定时器 MOV TH1,#0FDH;预置初值(按照波特率9600BPS预置初值) MOV TL1,#0FDH; 0FDH=9600=11.0592 MOV TH0, #0DCH;88H ;8800=12t,7000=stc1t MOV TL0, #00H ORL IE, #92H ;EA=1,ES=1;ET0=1 SETB PS ;串口中断优先 SETB TR1 ;启动定时器1 MOV 98H,#50H ;scon MOV P1M0,#01000000b ; P1M0=0 P1M1=0双向口 P1M0=1 P1M1=0输入口 P1M0=0 P1M1=1推挽输出20ma MOV P1M1,#10000000b MOV WDT_CONTR ,#27H 看门狗设置使能 QL0: MOV A,#00H MOV R0,#10H MOV R2,#9BH ;10-ABH清零 CLEAR: MOV @R0,A INC R0 DJNZ R2,CLEAR CLR FLAG CLR FLAG_0 SETB TR0 ;启动定时器0 ;ANL AUX,#07FH ;p3.0p3.1当串口 ORL AUX,#80H ;p1.7,p1.6当串口 CLR P3.7 ;485芯片接收使能 WA1: ;MOV WDT_CONTR ,#37H;喂狗; SETB CW JNB FLAG_0,WA1 ;FLAG_0=1表示已经接收到上位机数据 CLR TR0 MOV A,2CH ;检查设备地址是01h码,设本机地址码是1 MOV R2,A XRL A,#01H JNZ QL0 ACALL FSZJ ;FH: DB 01H,03H,16,00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,10H,11H,12H,0DH,0EH,0FH,10H,11H,12H,13H,14H,15H,16H,17H,18H,19H,1AH,1BH,1CH,1DH,1EH,1FH;18 ACALL DELAY CALL FZJ AJMP QL0 FZJ: MOV R0,#2cH ;向主机发送数据子程序 FZJ0: MOV R2,#10H FZJ1: CLR EA ANL AUX,#07FH ;p3.0p3.1当串口 FZL1: MOV A,@R0 MOV SBUF,A JNB TI,$ CLR TI INC R0 DJNZ R2,FZL1 SETB EA RET FSZJ: MOV DPTR,#FH MOV R2,#19; ORL AUX,#80H SETB P3.7 ;发送数据 MOV R0,#40H FSZJA: MOV A,#0H MOVC A,@A+DPTR MOV @R0,A INC R0 INC DPTR DJNZ R2,FSZJA MOV R0,#40H MOV CRCCD,#19 LCALL CRC1 MOV R2,#21 MOV R0,#40H FSZJ2: MOV A,@R0 MOV SBUF,A JNB TI,$ CLR TI INC R0 DJNZ R2,FSZJ2 SETB EA RET FH:DB 01H,03H,16,00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,10H,11H,12H,0DH,0EH,0FH,10H,11H,12H,13H,14H,15H,16H,17H,18H,19H,1AH,1BH,1CH,1DH,1EH,1FH;18 用串口助手检测到的数据如下图。 |
|