|
我个人觉得一个好的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输出点上去,这个也没有写定时器,它需要实际系里的定时中断。
补充一点的是,功能库可以单独编写,编译。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|