C#与倍福PLC通信的⽅法与实例
前⾔
公司使⽤CPP代码与PLC通信, 通信⽅式为ADS(倍福开放的通信⽅式).
偶然间发现倍福的ADS通信还⽀持其他好多种语⾔, 恰好最近在⽤C#写⼀些设备调试的⼩程序, 就尝试了下⽤C#写了⼀个demo程序, 可以做到控制⼀个⼩电机.
下⾯会对接⼝⽂件做⼀些说明, 并贴出实现代码.
准备
⾸先需要在⼯程中引⼊倍福官⽅提供的动态库, 位置在:C:\TwinCAT\AdsApi.NET\v4.0.30319, 当然如果你安装的倍福版本和我不⼀致, 最后的版本号可能会有变化.
引⼊⽅式是在⼯程中右击引⽤, 点击添加, 然后去对应的⽂件夹下到库⽂件, 最后在代码开头using⼀下, 如下图所⽰:
编码
1. 相关接⼝简介
这⾥⽤的类是TwinCAT.Ads.TcAdsClient, 主要是充当客户端⾓⾊, ⽽PLC充当服务器.
⼯程中声明这个类的实例后, 可以跳转到接⼝⽂档, 其中:
public void Connect(string netID, int srvPort);与PLC建⽴连接, 参数分别是AmsNetId和AmsPort, 另外还有5个重载⽅法, 没有本质区别.
public bool Disconnect();断开与PLC的连接.
public int CreateVariableHandle(string variableName);根据变量名称建⽴通信句柄, 根据该句柄可以对指定变量进⾏读写.
public int Read(int variableHandle, AdsStream dataStream);读句柄指向的PLC变量, 内容存到AdsStream类型变量中, 该类型看起来是个stream, 从⽗类⾥看, 应该可以转化成字符数组.
public int Read(long indexGroup, long indexOffset, AdsStream dataStream);倍福把不同种类的变量⽤indexGroup区分, indexOffset则需要去倍福⼯程内寻, ⽤起来挺⿇烦的, 试过, 很快就删了...
aspnet和net的区别public object ReadAny(int variableHandle, Type type);从句柄内读取指定类型的数据, 返回结果也是⽤户⾃⼰决定是什么, ⽐较⽅便地接⼝.
public void Write(int variableHandle, AdsStream dataStream);与Read类似, 也有根据变量表索引去写的, 不再赘述.
public void WriteAny(int variableHandle, object value);与ReadAny类似
public int AddDeviceNotification(...);添加绑定变量, 根据句柄或索引表绑定到PLC, ⼀般⽤于监控PLC变量的变化.
public int AddDeviceNotificationEx(...);上⾯的拓展⽅法, 区别是下⾯这个没有AdsStream类型参数.
public event AdsNotificationEventHandler AdsNotification;委托列表, 可以加回调函数, 它会在上⾯被绑定的变量出现变化时触发.
public event AdsNotificationEventHandler AdsNotificationEx;类似.
2. PLC部分
本⽂主要讲上位机的实现, 这部分简单带⼀下.
主函数调⽤⼦程序:TestAxisCtrl();, 该⼦程序⾥调⽤⼀个写好的功能块:AxisFb(), 所以接⼝名就是: "TestAxisCtrl.AxisFb.".
3. 上位机界⾯
中间的控制区是GroupBox, 根据连接状态决定是否可⽤.
下⾯有⼀个状态栏, 如果出现运⾏时错误会在这⾥打印.
4. 连接与断开
⾸先是全局变量和Form_Load:
点击查看代码
这⾥主要把实例和⼀些共⽤的属性放到全局, 在界⾯加载时初始化实例, 并读取配置⽂件中记载的AmsNetId. 然后就是连接和关闭按钮对应的触发函数:
点击查看代码
这⾥⽐较简单, 没啥好解释的.
5. 变量写⼊(使能和动作)
这⾥有点区别, 因为PLC变量有些是电平保持的, 有些是边沿触发的. 对于边沿的, 绑定click事件就⾏, 每次click都是上次结果的取反. ⽽边沿信号就要⽤Down和Up事件, ⽐如定位操作, ⿏标按下发置true, 松开就置false.保证发送给PLC的是⼀个脉冲(这部分也要看PLC的接⼝实现⽅式,也可以做成⾃复位的, 因为公司⾥都这么⽤, 就习惯了).
代码如下:
点击查看代码
这样, 每个按钮绑定的事件调⽤该函数就⾏, 省去了每次都写⼀堆的⿇烦:)
6. 变量反馈
倍福是⽀持事件触发回调的, 实现⽅式是先加Notify, 绑定到指定的PLC变量, PLC变量发⽣改变时触发(需要设置触发模式等参数).
实现代码如下:
点击查看代码
上⾯4条是绑定了我想监控的PLC变量, 第5条绑定了⾃定义触发函数`ProcessOutput()`. 每次这些变量发⽣改变就会触发该函数, 该函数具体如下:
点击查看代码
根据`NotificationHandle`确定是谁触发了该函数, 然后跳到指定分⽀执⾏逻辑.
7. 效果
最后附上运⾏效果图:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。