以台达EH2系列PLC为例,默认出厂设置是9600,7,1,E. 只要用串口调试助手向PLC发几次指令,就会熟练控制。比如想接通Y0点,就发(:01 05 0500 FF00 F6 CR LF )对应16进制是3A 3031 30353030 46463030 4636 0D 0A 其中:是起始码,01是地址,05是指令码,0500是Y0的通讯地址,FF00是强制节点开,F6是校验和,CR LF是结束字符。校验和自己计算,方法是01H+05H+05H+00H+FFH+00H=10AH,取后两位数0A的补码(FFH-0AH=F5H)F5再加1,即F6. 强制Y0接通以后PLC内部程序还可以照样控制Y0通断。
用串口调试助手发指令时别忘了把通讯参数设置好,最好点选16进制发送,当然发送的指令也得是16进制的3A 3031 30353030 46463030 4636 0D 0A 。成功通讯的话,PLC会返回数据显示在接收区。
单片机程序
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit sw=P1^0;
uint num=0;
uchar SendBuffer[]="";
void delay100ms(uchar times)
{
uint i=0,j=0,k=0;
for(k=0;k<times;k++)
for(i=0;i<100;i++)
for(j=0;j<67;j++);
}
void init(void) //串口初始化
{
TMOD=0x20;//
TH1=0xfd;
TL1=0xfd;//9600,
SCON=0x50;//
TR1=1;
}
/*void key()
{
num=(unsigned int)P0<<8+(unsigned int)P2;//强制转换,两个8位组合成一个16位
//一共16个开关对应PLC中M0到M15 16个寄存器,原样不动把他的状态值映射过去
//强制多个节点: 01 0f 0800 000f 02 P2 P0 LRC CR LF
//01+0F+08+0F+02=29
}*/
void main()
{
uchar i=0;
init();
while(1)
{
if(sw==0)
{
delay100ms(1);
if(sw==0)
{
unsigned char SendBuffer[]={":010f0800000f02"};
SendBuffer[15]=P2;
SendBuffer[16]=P0;
SendBuffer[17]=~(0x29+P2+P0)+1;
SendBuffer[18]=0x0d;
SendBuffer[19]=0x0a;
for(i=0;i<20;i++)
{
SBUF=SendBuffer[i];
while(TI==0);//等待发送出去
TI=0;
}
}
}
}
}