搜索
bottom↓
回复: 2

PLC开发思路

[复制链接]

出0入0汤圆

发表于 2011-10-18 20:58:09 | 显示全部楼层 |阅读模式
我个人觉得一个好的PLC还是需要在实时操作系统下面进行开发,这样有很多优执。
我工作地方用的是VxWork嵌入式系统。
开发程序很方便,使用FB方式编程。

下面是我根据其工作原理写的一个C程序,可以再XP下编译运行。但还不是PLC,只是其运行思路与功能库的定义。

         -----------
        |          |
I1------|          |------O1
        |          |
I2------|          |-------O2
        |          |
SEL-----|          |
        |          |
         ------------

实现功能为SEL为真时,O1=I1+I2,O2=I1*I2,SEL为假时,直接返回。

再这个程序里,每个输入输出口的数据是可以强制,我们工作地方的程序就是这样的。


#include <stdio.h>
#define etat_force(var,val)      if ( *((var)->force) )  *((var)->etat_force) = (val) ; else *((var)->etat) = (val)


//定义一个整型结构,里面包含原值,强制值,强制状态
typedef struct
                {
                int *etat ;
                int *etat_force ;
                int *force ;
                } INT_S ;




//为功能块定义输入输出接口
typedef        struct
        {
                INT_S        *i1 ;
                INT_S        *i2 ;
                INT_S        *sel ;                /* Selection of module */
                INT_S        *o1 ;                /* Addition i1 + i2 */
                INT_S        *o2 ;                /* Multiplication i1 * i2 */
        } S_TEST ;
//定义功能块

void TEST (S_TEST *pt_str)
        {
        int val;

        if (*(pt_str->sel->etat) == 0)
                return ;
        val = *(pt_str->i1->etat)+ *(pt_str->i2->etat);
        etat_force(pt_str->o1, val);
        val = *(pt_str->i1->etat)* *(pt_str->i2->etat);
        etat_force(pt_str->o2, val)        ;
                return ;
        }
//全局初始化定义
void INIT_GBVAR();

//接口定义
void IN_DEF();
void I_REF();
void OUT_DEF();
void FORCE();
void O_REF();



//全局数据接口定义
int e1=0,e2=0,e3=0,e4=0,e5=0;
int ef1=0,ef2=0,ef3=0,ef4=0,ef5=0;
int f1=0,f2=0,f3=0,f4=0,f5=0;

INT_S a1,a2,a3,a4,a5;
//实例化一个功能块
S_TEST A1;

//主程序
void main()
{
        //全局变量初如化
        INIT_GBVAR();


        //接口定义,这样只需在外部定义一定就可以
        IN_DEF();
        OUT_DEF();
        while(1)
        {
               
                //输入输出映象区刷新
                I_REF();
               
                //执行功能
                TEST(&A1);
        
                O_REF();

        }
}

//全局初始化
void INIT_GBVAR()
{
        //a1=0;
        //a2=0;
        //a3=0;
        //a4=0;
        //a5=0;
}

//功能块输入接口定义
void IN_DEF()
{
        a1.etat=&e1;
        a2.etat=&e2;
        a3.etat=&e3;
        a4.etat=&e4;
        a5.etat=&e5;

        a1.etat_force=&ef1;
        a2.etat_force=&ef2;
        a3.etat_force=&ef3;
        a4.etat_force=&ef4;
        a5.etat_force=&ef5;
       
        a1.force=&ef1;
        a2.force=&ef2;
        a3.force=&f3;
        a4.force=&f4;
        a5.force=&f5;



        A1.i1=&a1;
        A1.i2=&a2;
        A1.sel=&a3;
       
}
//功能块输出接口定义
void OUT_DEF()
{
        A1.o1=&a4;
        A1.o2=&a5;
       


}

void I_REF()
{
        printf("输入a1=");
        scanf("%d",&e1);
        printf("输入a2=");
        scanf("%d",&e2);
        printf("输入能使位=");
        scanf("%d",&e3);
        FORCE();
}

void O_REF()
{
        printf("输出a1+a2=%d\n",e4);
        printf("输出a1*a2=%d\n",e5);

}
void FORCE()
{
        printf("输出1是否强制=");
        scanf("%d",&f4);
        if(f4==0)
                ;
        else
        {        printf("输出强制=");
                scanf("%d",&e4);
        }
        printf("输出2是否强制=");
        scanf("%d",&f5);
        if(f5==0)
                ;
        else
        {        printf("输出强制=");
                scanf("%d",&e5);
        }
}

当我们将实际开发时,需要操心的是如何将控制的数据映射到实际的I/O输出点上去,这个也没有写定时器,它需要实际系里的定时中断。

补充一点的是,功能库可以单独编写,编译。

出0入0汤圆

 楼主| 发表于 2011-10-18 21:05:23 | 显示全部楼层

(原文件名:未命名.JPG)


(原文件名:未命名2.JPG)

出0入0汤圆

 楼主| 发表于 2011-10-18 21:12:04 | 显示全部楼层
它们编程环境在XP下,操作简间。
但背后执行过和就是,将拖进去的功能块产生相映的C代码,包括块能块接口数据定义,初始值定义,执行顺序等。
最后将整个程序编译,并联接库程序(是C代码以编好的程序,有一定的保密功能),然后通过网络下装到目标机中。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-29 06:55

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

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