Easyx图形库应用(mcu+lua vs plc+st)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
经常做工控的朋友都知道,之前plc编程主要是通过梯形图来完成的。不过随着plc能做的事情越来越多,plc开始也支持高级语言编程,比如谈的最多的就是st结构化编程。学过c语言的同学,学起st来,一般都相对而言都比较容易。其实细想一下,plc+st这种结构,它的本质就是mcu+lua,里面除了mcu之外,其实多了一层虚拟机。正是有了这层虚拟机的存在,让编程更轻松。
1、变量的io映射
如果是纯语言编程,数据类型无非就是char、short、int、float、double、string这些。但是plc上面带了很多的端口资源,所以很多时候需要把变量和对应的io资源绑定在一起。比如绑定的是输入,还是输出,绑定的是232还是485,如果是多个485,我们绑定的是哪一个等等。大家如果用codesys编译过st,就不会太陌生。
PROGRAM PLC_PRG
VARxStart AT %IX0.0:BOOL;iNumber AT %MW10:INT;
END_VAR
2、st运行的基本逻辑
在st运行之前,其实系统就准备好了硬件资源。等到运行用户的脚本之后,再将这些结果赋值给具体的端口,所以st的运行流程是这样的,
init_device();while(1)
{// user code// assign result to device io port
}
只要plc在运行,那么整个user code就是不停在调用的。中间没有停歇的过程。
3、lua的替代
既然我们知道了plc、st的基本原理,那么上面st的运行过程其实就可以替换成两部分。一部分是c语言代码,一部分是lua代码。c语言部分做的事情就是做好lua的底层实现。而lua重点负责业务的实现即可。c语言的代码就是这样的,
init_device();create_lua();
register_c_lib();launch_lua_file("./demo.lua");
release_lua();
和st不同的是,这里没有while(1)死循环的结构,因为我们是打算把这部分内容转移到demo.lua来完成。而demo.lua的结构是这样的,
while true do-- read value from device-- add our own procedure-- write result to device
end
当然,如果是希望做成和st一样的形式,那么反复调用luaL_dofile也是可以的,只是lua里面的变量要设置成local局部变量比较好。
4、所有的资源都可以映射到lua语言上
不同的mcu资源差异大,比如gpio、uart、usb、can、eth等等。当然,不管是什么样的资源都可以通过注册函数的形式映射到lua语言上面。这样使用起来就很容易。用户完全不用处理底层的逻辑,只要关心业务代码就可以。
当然有的同学可能会说mcu端口不够,其实这都不是问题。只要mcu旁边接一个fpga,大部分资源的问题就都解决了。
5、类easyx的应用也可以做成lua
一部分mcu也是可以做成驱屏设备。如果是这种情况,那么对屏幕的简单处理,比如直线、矩阵、圆形、填充、图片这些功能就可以做成lua的形式,方便上层应用。
6、lua脚本的好处
使用脚本的好处,主要就是可以屏蔽底层细节,完全把重心放到业务上面来。不用管中断、不用管汇编和c、也不用管寄存器配置,对于工控这样的场景来说是非常合适的。假设是c+lua开发,因为底层都被c实现了,lua一个init函数,就解决了所有配置问题。剩下来,就是自己的业务逻辑了。
7、mcu+rtos
如果是带算法又要有实时性,就可以mcu+rtos开发。这个时候用plc也不好使。但是这种开发方式对开发人员要求较高,所以用人选人是一个问题。最重要的其实还是成本的压力,特别是用人成本。