您的位置:控制工程论坛网论坛 » 台达自动化社区 » 单片机和台达PLC通讯

langfang

langfang   |   当前状态:在线

总积分:53  2024年可用积分:0

注册时间: 2012-12-15

最后登录时间: 2012-12-23

空间 发短消息加为好友

单片机和台达PLC通讯

langfang  发表于 2012/12/15 22:40:57      3433 查看 1 回复  [上一主题]  [下一主题]

手机阅读

    以台达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;
     }
   }
  }   
 }
}


1楼 0 0 回复