PLC 与“软件PLC“
早期的PLC 使用继电器实现逻辑控制。也就是说,它们完全是硬件实现的。当微处理器出现时,PLC 内部使用了CPU用程序实现控制逻辑。现代PLC实时操作系统和各种网络协议也被使用。自动控制行业的专家总是在通用操作系统上运行PLC控制程序成为软件PLC一般认为软件PLC 没有PLC 设备可靠,实时性差PLC设备强。这实际上是一种误解。某种意义上讲,现代的PLC 都是软件PLC。它们之间唯一的区别是PLC在特定硬件平台上实现的实时操作系统和程序具有更高的实时性、确定性和稳定性。它们经过制造商的反复测试。确保更好的软硬件匹配。如果重视软硬件的相互匹配,也可以在通用硬件平台上实现可靠运行PLC 系统。例如,倍福的工业计算机是在微软定制的windows 下运行。也很可靠。
实时性方面,大多数PLC 使用实时操作系统(RTOS),比如VxWorks OS。这是一个可靠、实时的实时操作系统。不过,RTOS处理能力也有限。想象一下编写一个巨大的程序PLC上运行, 性能也会下降。只是PLC 一般来说,杀鸡用牛刀,设备预留了足够的资源来保证特定应用的需求。
实时操作系统本质上是操作系统,但内部调度算法考虑了对外部事件的响应。但遗憾的是,几乎所有的东西都是OS 调度算法只是尽力而为。PLC 该方法是保留足够的硬件计算能力,以确保应用程序满足实时要求。为了提高PLC 计算能力,高性能PLC内部采用了FPGA 实现实时要求高的功能,如产生高速PWM 脉冲输出、运动控制模块、脉冲计数、电机编解码器等。
开放挑战
对现代控制系统PLC 引入更复杂的控制算法等控制算法提出了越来越高的要求,AI对于模块和云交互功能PLC 内部CPU/FPGA 另一方面,控制系统向开放方向发展,提出了更高的计算能力需求。第三方开发者和最终用户参与PLC 开发功能块。在PLC 程序和功能块升级将在生命周期内发生变化。如此一来,PLC事实上,制造商很难估计应用程序对计算能力的估计。而且很难承诺产品的实时性。但第三方开发者和用户可以更有效地确保系统的实时性能。
IEC61499 的实时性
目前大部分IEC61499 软件实现了功能块和操作,并PC或者Linux 运行在设备上IEC61499 目前是典型的软控制器。
问题确实存在,IEC61499 操作时的实时性和确定性确实令人担忧。为了解决这个问题,可以吸收PLC 的方式
- 改进设备内部SOC计算能力的剩余量
- 采取FPGA 加速功能块
- 实时功能块网络实现硬件。
采取FPGA 加速功能块
使用一些对计算能力较大的功能块FPGA 可缩短功能块的执行时间。提高功能块网络的实时性。
功能块内的算法由FPGA IP来实现。FB实现PS/PL 数据交换之间。FB包括:
- 高速PWM 发生器
- 高速脉冲计数器
- FFT 快速傅里叶
- 数字滤波器
然而,这种方法是有限的。功能块之间的数据和事件传输以及功能块的调度仍然由软件实现,存在不确定性。在高速电机控制中,控制环由多个功能块组成。如果功能块之间的数据传输由软件实现,则很难保证整个系统的实时性和确定性。
实现实时功能块网络硬件
实时处理要求高的一端功能块网络(如一个PID 使用环控)FPGA而配置,软件仍然实现监控和交互功能块。这种完整的硬件实现避免了软件干预造成的不确定性和实时性。这样完整的硬件实现,避免了软件的干预而造成不确定性和实时性。并且能够高速地处理控制算法和信号处理。
实现某一功能块网络硬件的最佳方法是将这些硬件功能块网封装成复合功能块。复合功能块通过工具软件转换成工具软件FPGA 硬件语言(HDL,verilog等)。由FPGA开发工具vivado 转换成FPGA 比特流。
IEC61499 实现硬件功能块
作者开始初步尝试FPGA 实现IEC61499 使用方法xilinx zynq 作为SOC平台。由于IEC61499 不流行,网上相关文章很少。你只能自己慢慢摸索
在IEC61499 在实现运行时,大多数功能块都被使用C 因此,我们希望采用类实现HLS 来实现C 类为基础的IEC61499 但发现了功能块HLS 几乎是为复杂算法准备的,使用C 类的介绍很少。如果实现非常接近数字逻辑的功能块,似乎不如verilog 语言更简单。
verilog 语言以module 作为编程单元,相当于C语言中的函数(function),然而,由于硬件的特殊性,所有变量都是静态分配的,因此C 有些相似,内部实现ECC状态机和算法非常方便。与此同时,verlog 功能块可以实例化。与此同时,verlog 功能块可以实例化。在其他模块中实现实例。与IEC61499 实例化功能块非常相似。使用verilog 语言编写IEC61499 硬件功能块更合适。
例子1-E_CTD 功能块
以下是作者使用的verilog 实现的一个E_CTD 计数器
`timescale 10ns / 1ns module e_ctd(cd,ld,cdo,ldo,v,cv,q);
input cd,ld;
input [15:0] pv;
output reg q,cdo,ldo;
output reg [15:0] cv;
reg [15:0] v;
always@(posedge cd)
begin
if (cv==0)begin
cv <= v;
#5 q=1;
end else
begin
cv <= cv - 1;
#5 q=0;
end
#5 cdo=1;
#5 cdo=0;
end
always@(posedge ld)
begin
v <= pv;
cv <= pv;
ldo=1;
#10 ldo=0;
end
endmodule
在上面的程序中,忽略了ECC 的实现。module e_ctd是功能块,下面的test 是仿真程序
仿真的结果
IEC61499 基本功能块都是底层逻辑构建得,使用verilog 语言描写非常合适,如果要深入研究IEC61499 功能块硬件化得课题,需要开发 hardware function block 库。在这个基础上开发一些构建工具(XML->verilog)
例2 -E_CYCLE 功能块
`timescale 10ns / 1ns
module e_cycle(start,stop,eo);
input start,stop;
output reg eo;
parameter FREQ = 100000; // in constraint_mode
parameter DUTY = 50; // in percentage
parameter clk_pd = 1.0/(FREQ * 1e3) * 1e9;
parameter clk_on = DUTY/100.0 * clk_pd;
parameter clk_off = (100.0 - DUTY)/100.0 * clk_pd;
reg start_clk;
initial begin
eo <= 0;
start_clk <= 0;
end
always @(posedge start) begin
if (start)
start_clk=1;
end
always @(posedge stop) begin
if (stop)
start_clk=0;
end
always @(posedge start_clk) begin
if (start_clk) begin
while (start_clk) begin
#(clk_on) eo=1;
#(clk_off) eo=0;
end
end
end
endmodule
例3 -E_T_FF
`timescale 10ns / 1ns
module E_T_FF(clk,eo,q);
input clk;
output reg eo,q;
initial
begin
q=0;
eo=0;
end
always @(posedge clk) begin
if (clk)
begin
q <=~q;
eo=1;
#2 eo=0;
end
end
endmodule
测试程序
测试程序完成IEC61499 功能块网络。
`timescale 10ns / 1ns
module test();
reg cd,ld;
wire cdo,ldo,q,q2;
wire [15:0] cv;
wire ecycle_eo,e_t_ff_eo;
reg start,stop;
E_CYCLE #(.FREQ(200000)) ecycle1(start,stop,ecycle_eo);
E_CTD #(.PV(8)) etcd1(ecycle_eo,ld,cdo,ldo,cv,q);
E_T_FF e_t_ff(cdo,e_t_ff_eo,q2);
initial
begin
#5 ld =0;
#5 ld=1;
#5 start=1;
#5 start=0;
end
initial
$monitor("at time %t ,",$time,"CDO=%b,LDO=%b,Q=%b,CV=%b",ecycle_eo,ldo, q,q2);
endmodule
仿真结果
软硬件接口
实现IEC61499 硬件功能块,需要设计一个统一的软硬件接口。如下图所示。
- IEC61499 运行时通过HFB API 访问硬件功能块
API 包括:
Event_Action() 向硬件FB 发送事件
Put_Data 向FB 发送数据
Get_Data读取FB数据
Event_Notify() 处理FB 输出的事件中断。(也可以是查询方式)
- ARM 处理器通过AXI-lite 接口与PL 端的AXI 外设IP 通信
write Register
readRegister
interrupt processing
输入事件寄存器(Input Event register)
输出事件寄存器(Output Event register)
输入数据寄存器(Input Data Register)
输出数据寄存器(Output Data Register)
当需要向功能块注入事件时,运行时向输入事件寄存器对应的bit 位置 1,硬件FB 检测输入事件寄存器的状态,一旦发现变化,转向事件处理。完成后,清除对应的状态位。
当功能块输出一个事件时,在输出事件寄存器相关位置1,并产生一个中断信号。由运行时软件读取事件寄存器,并且清零。
由软件直接写入或读取数据输入寄存器。这一点与软件实现有所不同,软件FB 处理时是通过 getDataIn根据connection 去数据源功能块中读取的。对于硬件FB,当事件来临时,API要根据事件-数据关联性,调用getDataIn 读取数据后需要写入数据输入寄存器中。
结束语
这只是一个开头,还有许多工作要做
1 软件功能块与硬件功能块的接口的实现方式
2 如何将IEC61499 复合功能块的XML 描述转换成verilog 的模块。
3 如何调用HLS 产生的IP
欢迎感兴趣的读者共同交流。这些技术同样可以应用到IEC61131-3 PLC 的高性能实现中。笔者认为作为后来者,国产控制设备需要提高更强大的性能,才可能让用户砰然心动。