搜索
bottom↓
回复: 10

用C语言进行PLC的辅助编程【恢复】

[复制链接]

出0入0汤圆

发表于 2008-12-19 10:07:34 | 显示全部楼层 |阅读模式
在PLC编程中,使用的是梯形图以及助记符,梯形图简单直观,但是分析总体的或段的逻辑并系不方便,占用程序行数太多。助记符就如汇编,看的多了头会大起来。

其实,PLC编程过程中,可以用C语言来进行辅助开发,先用C语言把逻辑关系理顺,然后再转换成梯形图程序,这里当然是手工转换。

如下面这段程序(西门子的PLC)



 (原文件名:snap.jpg) 

写成C语言就是:

if(((IN_STOP==1)&&(SM0_5==1))||(STSRT_F==1))

   O_LAMP=1;

if((IN_STOP==0)&&(IN_START==1)&&(IN_START_F==0))

   START_F=1;



这样的程序可以在KeilC里面调试运行,检查好逻辑关系后再写成PLC语句。

下面是其中一段子程序,基本上与梯形图一一对应,已经在Keil中调试完毕:

#include<AT89X52.H>

// 输入信号量:

bit IN_Qk_AN01=0,IN_QK_AN02=0,IN_QK_AN03=0,IN_DL01=0,IN_DL02=0,IN_DL03=0,IN_JT01=0,IN_JT02=0,IN_JT03=0,IN_M_A=0,IN_UP_DOWN=0;

unsigned char THREE_CHANGE=0;        // 三个档位选择

bit IN_QK_G1=0,IN_QK_G2=0,IN_QK_G3=0,IN_G1_FRONT=0,IN_G1_BACK=1,IN_G2_FRONT=0,IN_G2_BACK=1,IN_G3_FRONT=0,

    IN_G3_BACK=1,IN_G4_UP=0,IN_G4_DOWN=1,IN_STOP=1,IN_START=0;



bit O_QK_G1,O_QK_G2,O_QK_G3,O_G1,O_G2,O_G3,O_G4,O_DL1,O_DL2,O_DL3,O_HX,O_LAMP;





bit G1_CHANGE=0;       // 标志

bit G2_CHANGE=0;

bit G3_CHANGE=0;

bit G4_CHANGE=0;                                                                                          

bit G1_CHANGE01=0;

bit G2_CHANGE01=0;

bit G3_CHANGE01=0;

bit QK_G1_CHANGE=0;

bit QK_G2_CHANGE=0;

bit QK_G3_CHANGE=0;



bit QK_ALL_HE=0;       // 三个钳口开闭信号标志

bit DL_ALL_UP=0;       // 三个挡料板信号标志

// 自动模式 (1)

// 准备: 手动装夹工件--按钳口1~3夹紧按钮--按起动按钮 I3.6

// 钳口闭合后,传感器 IN_QK_G1=1;IN_QK_G2=1;IN_QK_G3=1;

main()

{

         for(;;)

        {

          if((O_QK_G1==0)&&(IN_Qk_AN01==1)) 

             O_QK_G1=1;       // 手动放置插接管,按下QK1闭合按钮,钳口1闭合

          if((O_QK_G2==0)&&(IN_QK_AN02==1)) 

             O_QK_G2=1;       // 手动放置插接管,按下QK1闭合按钮,钳口1闭合          

          if((O_QK_G3==0)&&(IN_QK_AN03==1)) 

             O_QK_G3=1;       // 手动放置插接管,按下QK3闭合按钮,钳口3闭合

                          // 讯号变化: IN_QK_G1=1;IN_QK_G2=1;IN_QK_G3=1

      if(((IN_QK_G1==0)&&(IN_QK_G2==0)&&(IN_QK_G3==0))&&(O_HX==1))             // 任一钳口未闭合,

           O_HX=0;                // 进气阀切换为低压

           /*****************/

           // IN_STOP=0;      

           /*****************/                                       

          if((IN_STOP==0)&&(IN_QK_G1==1)&&(IN_QK_G2==1)&&(IN_QK_G3==1)&&(O_HX==0))                 // 所有钳口闭合,

          {

             O_HX=1; QK_ALL_HE=1; O_DL1=1;O_DL2=1;O_DL3=1;         // 置位钳口标识 ,切换为高压

          }                                                  // 讯号变化 IN_DL01=1;IN_DL02=1;IN_DL03=1

          if((IN_START==1)&&(DL_ALL_UP==0)&&(IN_DL01==1)&&(IN_DL02==1)&&(IN_DL03==1))  

             DL_ALL_UP=1;             // 讯号变化: IN_START=1

          if((DL_ALL_UP==1)&&((IN_DL01==0)||(IN_DL02==0)||(IN_DL03==0)))

             DL_ALL_UP=0;        

          if((O_G4==0)&&(QK_ALL_HE==1)&&(IN_G4_DOWN==1)&&(G4_CHANGE==0)&&(DL_ALL_UP==1))    // 

          {

             O_G4=1;          // 讯号变化:IN_G4_DOWN=0; IN_G4_UP=1

          }



          if(((O_G1==0)&&(QK_ALL_HE==1)&&(IN_G1_BACK==1))&&(((IN_G4_UP==1)&&(G4_CHANGE==0)&&(G1_CHANGE==0)&&(DL_ALL_UP==1))

            ||((O_G1==0)&&(G4_CHANGE==1)&&(IN_G4_DOWN==1)&&(G1_CHANGE01==0)&&(DL_ALL_UP==1)))) // 如果G1在退回位,G4上位,或G4已经完成一个动作循环

      {

             O_G1=1;   // 讯号变化:IN_G1_BACK=0;IN_G1_FRONT=1

                 // 延时0.5秒   以使气缸进位

          }



          if((O_G1==1)&&(IN_G1_FRONT==1)&&(((QK_ALL_HE==1)&&(IN_G4_UP==1)&&(G4_CHANGE==0))

            ||((O_G1==1)&&(QK_ALL_HE==0)&&(G4_CHANGE==1)&&(IN_G4_DOWN==1)&&(QK_G1_CHANGE==1))))

          {   

             O_G1=0;         // 讯号变化: IN_G1_BACK=1;IN_G1_FRONT=0

                 if(IN_G4_UP==1)

                    G1_CHANGE=1;  

                 if(IN_G4_DOWN==1)

                    G1_CHANGE01=1;



                          // 置G1动作标识为1,以与原始状态的O_G1 "0" 状态相区别

          }

          if((O_G3==0)&&(IN_G1_BACK==1)&&(IN_G3_BACK==1)&&(((G1_CHANGE==1)&&(IN_G4_UP==1)&&(QK_ALL_HE==1)&&(G3_CHANGE==0)&&(DL_ALL_UP==1))

            ||((O_G3==0)&&(G1_CHANGE01==1)&&(IN_G4_DOWN==1)&&(QK_ALL_HE==0)&&(G3_CHANGE01==0)&&(DL_ALL_UP==1))))

             O_G3=1;                // 信号变化:IN_G3_BACK=0;IN_G3_FRONT=1

                                // 延时0.5秒,以使气缸进位

          if((O_G3==1)&&(IN_G3_FRONT==1)&&(((QK_ALL_HE==1)&&(IN_G4_UP==1)&&(G1_CHANGE==1))

            ||((O_G3==1)&&(QK_ALL_HE==0)&&(G4_CHANGE==1)&&(IN_G4_DOWN==1)&&(QK_G3_CHANGE==1))))

          {

             O_G3=0;          // 讯号变化:IN_G3_BACK=1;IN_G3_FRONT=0

                   if(IN_G4_UP==1)

                G3_CHANGE=1;

                 if(IN_G4_DOWN==1)

                    G3_CHANGE01=1;

          }

      if((O_G2==0)&&(IN_G3_BACK==1)&&(IN_G2_BACK==1)&&(((G3_CHANGE==1)&&(IN_G4_UP==1)&&(QK_ALL_HE==1)&&(G2_CHANGE==0)&&(DL_ALL_UP==1))

            ||((O_G2==0)&&(G3_CHANGE01==1)&&(IN_G4_DOWN==1)&&(QK_ALL_HE==0)&&(QK_G3_CHANGE==1)&&(G2_CHANGE01==0)&&(DL_ALL_UP==1))))             

                 O_G2=1;           // 信号变化:IN_G2_BACK=0;IN_G2_FRONT=1

                 // 延时0.5秒,以使气缸进位

          if((O_G2==1)&&(IN_G2_FRONT==1)&&(((G3_CHANGE==1)&&(IN_G4_UP==1)&&(QK_ALL_HE==1))

            ||((O_G2==1)&&(G3_CHANGE01==1)&&(IN_G4_DOWN==1)&&(QK_ALL_HE==0)&&(QK_G3_CHANGE==1))))          

          {

             O_G2=0;          // 信号变化:IN_G2_BACK=1; IN_G2_FRONT=0         

                   if(IN_G4_UP==1)

                    G2_CHANGE=1;

                 if(IN_G4_DOWN==1)

                    G2_CHANGE01=1;

          }

          if((O_G4==1)&&(IN_G2_BACK==1)&&(G2_CHANGE==1)&&(IN_G4_UP==1)&&(QK_ALL_HE==1))

          {

             O_G4=0;          // 信号变化:IN_G4_DOWN=1;IN_G4_UP=0                 

                 G4_CHANGE=1;

          }

          //  G1进--见上

          if((O_QK_G1==1)&&(QK_ALL_HE==1)&&(G4_CHANGE==1)&&(IN_G4_DOWN==1)&&(IN_G1_FRONT==1))          

          {

             O_QK_G1=0;                // 信号变化: IN_QK_G1=0  钳口1松开

                 // 延时0.5秒,以使钳口松开

                 QK_ALL_HE=0;

          }

          if((QK_G1_CHANGE==0)&&(IN_QK_G1==0)&&(G4_CHANGE==1)&&(IN_G4_DOWN==1)&&(IN_G1_FRONT==1))          

                 QK_G1_CHANGE=1;          

          

          // G1 退--见上

          // G3 进--见上

          if((O_QK_G3==1)&&(QK_ALL_HE==0)&&(G4_CHANGE==1)&&(IN_G4_DOWN==1)&&(IN_G3_FRONT==1))

          {

             O_QK_G3=0;                 // 信号变化:IN_QK_G3=0

                 // 延时0.5秒                 

                 QK_G3_CHANGE=1;

          }

          // G3 退--见上

      // G2 进--见上

          // G2 退--见上

          if((O_QK_G2==1)&&(G2_CHANGE01==1)&&(IN_G2_BACK==1))

          {    

                O_QK_G2=0;          // 讯号变化: IN_QK_G2=0

                QK_G2_CHANGE=1;

          }



      if((IN_STOP==1)||((QK_G2_CHANGE==1)&&(IN_QK_G2==0)))               // 插接完毕,复位所有标识

          {

           // 复位所有标志

           G1_CHANGE=0;       // 标志

       G2_CHANGE=0;

       G3_CHANGE=0;

           G4_CHANGE=0;

       G1_CHANGE01=0;

       G2_CHANGE01=0;

       G3_CHANGE01=0;

       QK_G1_CHANGE=0;

       QK_G2_CHANGE=0;

       QK_G3_CHANGE=0;

           // 输出复位

           O_HX=0;

           O_DL1=0;

           O_DL2=0;

           O_DL3=0;

           

          }

          if(IN_STOP==1)        // 按下停止按钮,所有的动作元件复位

          {

             O_QK_G1=0,O_QK_G2=0,O_QK_G3=0,O_G1=0,O_G2=0,O_G3=0,O_G4=0,O_DL1=0,O_DL2=0,O_DL3=0,O_HX=0,O_LAMP=0;// 注:灯要设置为闪动指示

          }



        }

}

出0入0汤圆

发表于 2009-3-22 21:12:30 | 显示全部楼层
一个字,牛

出0入0汤圆

发表于 2009-3-31 22:07:57 | 显示全部楼层
强!~1
得学学看看那。

出0入0汤圆

发表于 2009-4-22 16:34:16 | 显示全部楼层
好技巧,我的学习一下

出0入0汤圆

发表于 2009-5-11 17:32:01 | 显示全部楼层
很强大,也很麻烦

出0入0汤圆

发表于 2010-1-25 15:30:01 | 显示全部楼层
我还是用梯形图吧,

出0入0汤圆

发表于 2010-3-18 14:36:07 | 显示全部楼层
梯形图配仿真软件调试挺好的,先初步把逻辑调好后,再用真PLC,挺方便的感觉

出0入0汤圆

发表于 2010-3-23 20:32:28 | 显示全部楼层
本来就是梯形图编译成C在编译成机器代码,现在搞成这个样子,来回反复编译,不晓得发明梯形图到底是为了什么?

出0入0汤圆

发表于 2010-3-23 22:18:09 | 显示全部楼层
受教

出0入0汤圆

发表于 2010-5-27 21:19:55 | 显示全部楼层
这个没看懂!汗。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-2 19:05

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表