PLC通讯实现-C#实现欧姆龙串口通讯HostLink(一)

PLC通讯实现-C#实现欧姆龙串口通讯HostLink(一)

  • 背景
  • 抽象设计
  • 欧姆龙串口通讯实现HostLink

背景

本人近十年的工作都与工业软件相关、其中工控系统开发过程中有一个必要环节就是跟各大厂商的PLC进行通讯,而对于从互联网行业跨入工业互联网行业的从业人员来说要实现各型号PLC通讯还是需要一个过程的,本人在此对主流型号PLC通讯实现进行总结以便大家参考。

抽象设计

首先我们要进行一下抽象设计,先设计一个抽象类(接口也可以,此处因为还有其他业务使用了抽象类)BaseEquip,对PLC的常规操作进行定义,即Open、Read、Write、Close,业务代码调用BaseEquip进行PLC的读写,然后在实现各型号的Equip类,对Open、Read、Write、Close进行实现,根据配置在业务代码中对BaseEquip进行实例化,这样后期更改PLC型号后,只需修改配置即可,不用修改业务代码。

欧姆龙串口通讯实现HostLink

实现语言C#

抽象基类BaseEquip

public class BaseEquip
{/// /// 打开设备/// /// 成功返回true,失败返回falsepublic abstract bool Open();/// /// 读取信息/// /// 数据块/// 起始地址/// 长度/// 读取返回信息/// 成功返回true,失败返回falsepublic abstract bool Read(string block, int start, int len, out object[] buff);/// /// 写入信息/// /// 数据块/// 起始地址/// 要写入的数据/// 成功返回true,失败返回falsepublic abstract bool Write(int block, int start, object[] buff);/// /// 关闭设备/// public abstract void Close();
}

设备实现类Equip实现

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Mesnac.Equips;namespace Mesnac.Equip.OMRON.HostLink.COM
{/// /// 三菱通讯封装设备类/// public class Equip : BaseEquip{private SerialPortFactory _serialPortFactory = null; //SerialPortFactory.GetInstance("00", "COM3", 9600, "Even", 7, "2", 1024);private bool _isOpen = false;   //是否打开连接/// /// 获取串口工厂/// /// private SerialPortFactory GetSerialPortFactory(){Mesnac.Equips.Connection.COM.ConnType connType = (Mesnac.Equips.Connection.COM.ConnType)this.Main.ConnType;string stationNum = connType.StationNum;string portName = connType.PortName;int baudRate = connType.BaudRate;string parity = connType.Parity;int dataBits = connType.DataBits;string stopBits = connType.StopBits;int buffSize = connType.BuffSize;this._serialPortFactory = SerialPortFactory.GetInstance(stationNum, portName, baudRate, parity, dataBits, stopBits, buffSize);return this._serialPortFactory;}/// /// 打开PLC设备/// /// public override bool Open(){lock (this){try{if (this._isOpen == true || (_serialPortFactory != null && _serialPortFactory.MainSerialPort.IsOpen)){return true;}this.State = false;this._serialPortFactory = this.GetSerialPortFactory();this._serialPortFactory.MainSerialPort.Open();if (!_serialPortFactory.MainSerialPort.IsOpen){ICSharpCode.Core.LoggingService.Warn("PLC连接失败:串口未打开失败!");this.State = false;return this.State;}else{this.State = true;this._isOpen = true;//Console.WriteLine("连接成功!");return this.State;}}catch (Exception ex){this.State = false;this._isOpen = false;Console.WriteLine(ex.Message);return this.State;}}}/// /// PLC数据读取方法/// /// 要读取的块号/// 要读取的起始字/// 要读取的长度,最大255,超过255则不读取/// /// public override bool Read(string block, int start, int len, out object[] buff){lock (this){buff = new object[len];try{if (len > 256){for (int i = 0; i < len; i++){buff[i] = 0;}base.State = false;return false;}int maxOneLen = 20;                    //单次允许读取的最大长度,欧姆龙限制为20个字int count = len / maxOneLen;            //要读取的次数int mod = len % maxOneLen;              //剩余的长度bool flag = true;                       //保存读取标志for (int i = 0; i < count; i++){object[] _buff = new object[maxOneLen];flag = this.ReadByLen(block, start + i * maxOneLen, maxOneLen, out _buff);if (flag == false){base.State = flag;return false;}for (int k = i * maxOneLen; k < (i + 1) * maxOneLen; k++){buff[k] = _buff[k - i * maxOneLen];}}if (mod > 0){object[] _buff = new object[mod];flag = this.ReadByLen(block, start + count * maxOneLen, mod, out _buff);if (flag == false){base.State = flag;return false;}for (int k = count * maxOneLen; k < count * maxOneLen + mod; k++){buff[k] = _buff[k - count * maxOneLen]


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部