阀测试项目软件,上位机通过Labwindows/CVI编写,下位机使用的是倍福PLC,下位机软件通过TwinCAT3编写,上位机和下位机通过ADS通讯,还包括一台S7-200 smart,通过OPC进行通讯,控制油源。
最近参与了一个超有意思的阀测试项目软件的开发,今天就来跟大伙唠唠这里面的门道。这个项目里,上位机是用Labwindows/CVI打造的,而下位机则选择了倍福PLC,通过TwinCAT3来编写程序。它们之间的通讯采用了ADS协议,同时项目里还有一台S7 - 200 smart,靠着OPC来控制油源。
上位机Labwindows/CVI
Labwindows/CVI是一款功能强大的软件开发环境,特别适合测试测量领域。就拿界面设计这块来说,代码写起来还挺直观的。
#include <cvirte.h> #include <userint.h> #include "resource.h" int panelHandle; int main (int argc, char *argv[]) { if (InitCVIRTE (0, argv, 0) == 0) return -1; /* out of memory */ if ((panelHandle = LoadPanel (0, "resource.uir", PANEL)) < 0) return -1; DisplayPanel (panelHandle); RunUserInterface (); DiscardPanel (panelHandle); QuitUserInterface (0); return 0; }上面这段代码是一个简单的Labwindows/CVI程序框架。首先通过InitCVIRTE初始化运行时环境,如果初始化失败就返回 -1 ,毕竟内存不足这事儿可不能马虎。接着用LoadPanel加载我们设计好的用户界面资源文件resource.uir,这个文件里定义了各种按钮、图表啥的控件。要是加载失败同样返回 -1 。加载成功后就调用DisplayPanel把界面展示出来,最后RunUserInterface开始进入消息循环,让程序可以响应用户的操作,比如点击按钮啥的。
下位机倍福PLC与TwinCAT3
倍福PLC在工业控制领域那是相当出名,TwinCAT3更是为它编写程序提供了高效的平台。比如说我们要实现一个简单的逻辑控制,在TwinCAT3里可以这样写:
PROGRAM PLC_PRG VAR input : BOOL; output : BOOL; END_VAR input := ADR(PLC_IN.0); output := input AND NOT ADR(PLC_IN.1); ADR(PLC_OUT.0) := output;这里我们定义了两个变量input和output,都是布尔类型。然后把input连接到输入端口PLCIN.0,output的逻辑是input和PLCIN.1取反后的与操作,最后把output连接到输出端口PLC_OUT.0。这样就完成了一个简单的逻辑判断和输出控制。
ADS通讯实现上位机与下位机交互
ADS通讯在这个项目里扮演着关键角色,负责上位机和下位机的数据交互。在Labwindows/CVI这边,我们可以用动态链接库来实现ADS通讯相关功能。
#include <windows.h> #include "TcAdsDll.h" HRESULT AdsPortOpen(void) { return AdsPortOpenEx(0); } HRESULT AdsSyncReadReq(ADS_PORT port, AMSNETID amsNetId, ADRSIG nAddr, DWORD cbLength, void *pData) { return AdsSyncReadReqEx(port, amsNetId, nAddr, cbLength, pData); }AdsPortOpen函数通过AdsPortOpenEx来打开ADS端口,成功返回相应的结果。AdsSyncReadReq函数则是用来从下位机读取数据,通过AdsSyncReadReqEx实际执行读取操作,传入端口号、目标AMS网络ID、地址、数据长度以及存放读取数据的指针。
OPC通讯控制S7 - 200 smart
对于S7 - 200 smart,我们借助OPC来实现通讯控制油源。在客户端这边,我们可以用一些开源的OPC库来进行开发。
import opcua client = opcua.Client("opc.tcp://192.168.0.100:4840") try: client.connect() root = client.get_root_node() var = root.get_child(["0:Objects", "2:MyVariable"]) value = var.get_value() print("Value of variable: ", value) finally: client.disconnect()这段Python代码用opcua库来连接到S7 - 200 smart对应的OPC服务器。先创建一个Client对象,指定服务器的地址。然后尝试连接,连接成功后获取根节点,再通过节点路径找到我们需要操作的变量MyVariable,读取它的值并打印出来,最后别忘了断开连接。
这个阀测试项目软件通过这样一套复杂又精妙的架构,实现了各个部分的协同工作,为阀测试提供了可靠的软件支持。