PLC与电子看板通讯显示程序和资料

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

修定日期:2011-09-13
一、总命令框架定义:
(通讯波特率为:9600,1位起始位,8位数据位,1位停止位,无奇偶校验位。

)同步头1 同步头2 包地址IPB指令包检验码
注:第1字节为同步头1,固定为0x97。

第2字节为同步头2,固定为0x00。

第3字节为包地址选择,0x00为公共地址,主要用于个用于系统广播,从方不能有指令包回传。

地址范围从0x01到0xff共255个,不相等地址的显示屏会忽略相应的指令包。

第n字节为检验码,其值从第1字节至第n-1字节相加之和再7F相与。

接收方可以根据这个检验码判断这个包
IPB指令包框架:
指令长度指令类型参数0 …….. 参数X 检验码
字节1为指令长度,其值为每包指令的长度,包括字节1本身的长度,但不包括检验码的长度,分为最短、标准及加长多种范围,最短的长度的范围从2
到28,标准的有效范围为2~137。

字节2为指令类型,代表这一包指令的类型。

字节3至字节n-1,为参数区。

LED控制协议指令长度指令类型备注说明
PLC下发命令B1 显示速度: 97 00 01 06 B1参数0-参数3 IPCK CK 参数0:看板显示速度的最高位
参数1:看板显示速度的中间位
参数2:看板显示速度的最低位
参数3:看板显示速度有无小数点
0xaa:无小数点 0x01:一位小数
0x02:两位小数(其他无效)
IPCK= (0x06+B1+参数0+--+参数3)&&0x7F;
CK=
(97+00+01+06+B1+参数0+--+参数3+IPCK)&&0x7f;
指令长度指令类型备注说明
看板回码DB 显示速度: 97 00 01 06 DB 参数0-参数3 IPCK CK 参数0:看板显示速度的最高位
参数1:看板显示速度的中间位
参数2:看板显示速度的最低位
参数3:看板显示速度有无小数点
0xaa:无小数点 0x01:一位小数
0x02:两位小数(其他无效)
IPCK= (0x06+DB+参数0+--+参数3)&&0x7F;
Plc和看板通讯说明:
1、当plc检测到速度发生了改变,则plc按照上述协议向看板下发指令。

2、看板接收到了正确的指令后,按照协议回码给plc。

3、Plc接收到正确的回码后此次通讯结束。

当plc没有接收到正确的回码重发上一条
指令。

Plc连续发3次任然没有接收到正确的回码放弃此次通讯。

4、看板不会主动向plc发送任何指令。

只是被动接收到plc的指令后做出回应。

PLC下发命令看板回传命令
5、97 00 01 06 B1 04 05 06 07 4D 32 97 00 01 06 DB 04 05 06 07 77 06
6、97 00 01 06 B1 01 82 03 01 3E 14 97 00 01 06 DB 01 82 03 01 68 68
7、97 00 01 06 B1 06 82 03 01 43 1E 97 00 01 06 DB 06 82 03 01 6D 72
8、97 00 01 06 B1 07 88 09 01 50 38 97 00 01 06 DB 07 88 09 01 7A 0C
9、97 00 01 06 B1 08 02 06 02 49 2A 97 00 01 06 DB 08 02 06 02 73 7E
10、97 00 01 06 B1 08 04 05 AA 72 7C 97 00 01 06 DB 08 04 05 AA 1C 50
一、主程序
/**********************************************************************
Function: PLC下发数据看板显示接收到的内容
Create_by: yufengbing 2012——03——30
Discrtion:详细见协议
**********************************************************************/
#include <rtx51tny.h>
#include<STC12C5620AD.h>
#include<define.h>
#include<function.h>
////////////////////////////////主函数//////////////////////////
void main_task() _task_ 0
{
os_create_task(0);
os_create_task(1);
os_create_task(2);
Serial_Init();
EN485=0;
EA=1;
status_init();
while(1)
{
unsigned char i;
WDT_CONTR = 0x3C;
os_wait2(K_TMO,20);//
WDT_CONTR = 0x3C;
EN485=0;
LED=~LED;//测试用此处可以运行其他程序。

if(end==1){end=0; os_send_signal(1); }//运行通讯处理程序
os_send_signal(2);
for(i=0;i<3;i++){displayarray[i]=display_temp[i];}
}
}
二、通讯程序
#include <rtx51tny.h>
#include<STC12C5620AD.h>
#include<define.h>
#include <math.h> //Keil library
#include <stdio.h> //Keil library
#include <stdlib.h>
uchar MCU_ID=0x01; //下位机的ip地址
unsigned char index;
unsigned char index_counter; //接收数据的长度设置
unsigned char end; //接收数据结束
unsigned char Checksum_one,Checksum_two; //数据的校验
xdata unsigned char recive_buf[30];//接收数据缓存区
unsigned char display_temp[10]; //通讯接收后的595显示数据缓存区。

unsigned char display_Backtemp[4]; //通讯接收后处理了数据后回传给plc /**************************************************************** Function:初始化串口通信接收缓存区和需要接收的数据个数
Description:清除接上rx.buf中的内容
****************************************************************/ void status_init()
{
uchar i;
index=0;
index_counter=11;//此处为接收数据的长度设置。

end=0;
Checksum_one=0;
Checksum_two=0;
for(i=0;i<30;i++)
recive_buf[i]=0x00;
}
/****************************************************************
Function:初始化串口通信寄存器
Description:
****************************************************************/
void Serial_Init(void) //串口初始化
{
/////串口初始化
SCON=0x50;///SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD|=0x21;//TMOD: timer 1, mode 2, 8-bit reload,timer 0 is 16 bit counter
PCON =0x00;//SMOD=0;//如果SMOD=0即PCON=0x80,则此时Baud:4800 fosc=11.0592MHz TH1=0xfd;//Baud:2400 fosc=11.0592MHz
// EA=1; 下一句已经包含IE|=0x90,EA为IE中一位
//IE|=0x90;//Enable Serial Interrupt
TR1=1;// timer 1 run //TR1是TCON中的一位
ES=1;
ET1=0;
PS=1;
#if 0
SCON=0x50;///SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD|=0x21;//TMOD: timer 1, mode 2, 8-bit reload
PCON|=0x00;//SMOD=0;//如果SMOD=0即PCON=0x80,则此时Baud:4800 fosc=11.0592MHz TH1=0xfd;//Baud:2400 fosc=11.0592MHz
// EA=1; 下一句已经包含IE|=0x90,EA为IE中一位
IE|=0x90;//Enable Serial Interrupt
TR1=1;// timer 1 run //TR1是TCON中的一位
//TI=1;
#endif
}
/****************************************************************
Function:串口通信发送一个字符
Description:串口发送一个字节数据
****************************************************************/
void SendCharCom(unsigned char ch)
{
ES=0;
EN485=1;
SBUF=ch;
while(0==TI);
TI=0;
os_wait2(K_TMO,2);//Delayms(2);
EN485=0;
os_wait2(K_TMO,2);//Delayms(2);
ES=1;
}
/****************************************************************
Function:串口通信发送一个字符串
Description:串口发送一个字符串,strlen为该字符串长度
****************************************************************/
void SendStringCom(unsigned char *str,unsigned int strlen)
{
xdata unsigned int k=0;
do
{
SendCharCom(*(str+k));
k++;
}while(k<strlen);
}
/****************************************************************
Function:串口中断
Description:串口中断接收函数
****************************************************************/
void Serial(void) interrupt 4 using 3
{
if(RI==1)
{
// EN485=1; /*此处一定要注意若是使用rs485时不能要,rs232让EN485等于1*/ RI=0;
recive_buf[index++] = SBUF;
if(index>=index_counter)
{index=0;end=1;}//此处判断接收数据结束,并置标准位为1.后续处理}
}
/****************************************************************
Function:校验码的计算
Description:校验为和&0x7f
****************************************************************/
void com_datachecksum()
{
uchar i;
for(i=0;i<10;i++)Checksum_one=Checksum_one+recive_buf[i];
for(i=0;i<6;i++) Checksum_two=Checksum_two+recive_buf[i+3];
Checksum_one=Checksum_one&0x7f;
Checksum_two=Checksum_two&0x7f;
}
/****************************************************************
Function:接收到plc发来的命令正确处理后的回码
Description:校验为和&0x7f
****************************************************************/
void com_back_Ack()
{
unsigned char i,ACK_data[11];
unsigned char check_sum1=0,check_sum2=0;
ACK_data[0]=0x97;
ACK_data[1]=0x00;
ACK_data[2]=MCU_ID;
ACK_data[3]=0x06;
ACK_data[4]=0xDB;
ACK_data[5]=display_Backtemp[0];
ACK_data[6]=display_Backtemp[1];
ACK_data[7]=display_Backtemp[2];
ACK_data[8]=display_Backtemp[3];
for(i=0;i<6;i++) {check_sum1=check_sum1+ACK_data[3+i];}
ACK_data[9]=check_sum1&0x7f;
for(i=0;i<10;i++) {check_sum2=check_sum2+ACK_data[i];}
ACK_data[10]=check_sum2&0x7f;
SendStringCom(ACK_data,11);//此处处理发送数据。

}
/****************************************************************
Function:串口接收数据处理
Description:串口中断接收数据后处理程序
****************************************************************/
void manage_serialdate() _task_ 1
{
while(1)
{
os_wait1(K_SIG);
WDT_CONTR = 0x3C;
if((recive_buf[0]==0x97)&&(recive_buf[1]==0x00)&&(recive_buf[2]==MCU_ID))
{
com_datachecksum(); //检测校验码
if((Checksum_one==recive_buf[10])&&(Checksum_two==recive_buf[9]))
{
switch(recive_buf[4])
{
case 0xB1:
display_temp[0]= recive_buf[5]; //将接收到数据送入显示缓存区
display_temp[1]= recive_buf[6];
display_temp[2]= recive_buf[7];
display_temp[3]= recive_buf[8];
display_Backtemp[0]=display_temp[0]; //将接收到数据零时存储便于回码
display_Backtemp[1]=display_temp[1]; //因为后面处理小数点后被覆盖
display_Backtemp[2]=display_temp[2];
display_Backtemp[3]=display_temp[3]; //接收小数点的位数
if(display_temp[3]==0x01) d isplay_temp[1]=display_temp[1]|0x80; //添加十位小数点
if(display_temp[3]==0x02) d isplay_temp[0]=display_temp[0]|0x80; //添加百位小数点
com_back_Ack(); //发送回码
break;
case 0xB2: //备用
break;
case 0xB3: //备用
break;
default: break;
}
}
}
status_init();//处理过接收的数据后要对接收缓冲区清零
}
}。

相关文档
最新文档