命名空间:netMarketing.automation.plc.OmronPlc
功能:基于欧姆龙RS232 Host Link Fins协议通讯类
功能详细说明:
欧姆龙PLC的 Host Link Fins通讯协议是一种帧通讯协议,它可以批量读取或者写入数据到PLC内存区,支持DM, A, W, T, CIO, H 等内存区,并且可以读了字或者位。另外,HostLink协议只支持读取监视模式下的数据,而Host Link Fins协议无论在监视还是运行模式下都是可以读写的。
对于hostlink Fins通讯帧,可以参考下面贴子的说明:
欧姆龙Plc Fins命令+Hostlink协议通讯实验
常用函数列表:
/// fins指令的数据类型字段枚举:Bit,Word,CompletionFlag,EMcurrentBankNo,PV,Status public enum finsDataTypeEnum /// fins指令的区域类型:CIO,DM,W,H,T,A public enum finsAreaTypeEnum /// 是否成功连接上plc public bool IsConnect /// 构造函数,由SerialParamType定义串口参数 public OmronPlc(SerialParamType serialConfig) /// 构造字符串格式为: COM1,9600,8,2,N public OmronPlc(string serialConfig) /// 设置串口配置,由SerialParamType进行配置。当使用空参数构造函数后,才需要调用本函数配置串口 public void setSerialConfig(SerialParamType serialConfig) /// 发送基于hostlink协议的字符串,以测试plc是否可以正常通讯 public bool TestConnect() /// 欧姆龙PLC HostLink协议的FCS运算,并添加“*CR” public string Command(string Str) /// 把int32转为4位的十六进制数字符串 public static string DEC2HEX(string ox) /// HostLink Fins指令的读DM区,一次最多读取270个通道 public string ReadDM_Fins(int Addr, int readCount, finsDataTypeEnum dataType = finsDataTypeEnum.Word, string unitNo = "00",string ResponseWaitTime="0") /// HostLink Fins指令的读CIO区,即IO通道 public string ReadCIO_Fins(int Addr,int readCount, finsDataTypeEnum dataType = finsDataTypeEnum.Bit, string unitNo = "00", string ResponseWaitTime = "0") /// HostLink Fins指令的读W区,即内部辅助继电器 public string ReadW_Fins(int Addr, int readCount, finsDataTypeEnum dataType = finsDataTypeEnum.Word, string unitNo = "00", string ResponseWaitTime = "0") /// HostLink Fins指令的读H区,即内部掉电保持继电器 public string ReadH_Fins(int Addr, int readCount, finsDataTypeEnum dataType = finsDataTypeEnum.Word, string unitNo = "00", string ResponseWaitTime = "0") /// HostLink Fins指令的读T区,即内部定时器区 public string ReadT_Fins(int Addr, int readCount, finsDataTypeEnum dataType = finsDataTypeEnum.CompletionFlag, string unitNo = "00", string ResponseWaitTime = "0") /// HostLink Fins指令的读A区,即内部特殊辅助继电器 public string ReadA_Fins(int Addr, int readCount, finsDataTypeEnum dataType = finsDataTypeEnum.Word, string unitNo = "00", string ResponseWaitTime = "0") /// fins协议写dm区 public string WriteDM_Fins(int Addr, string sendData, finsDataTypeEnum dataType = finsDataTypeEnum.Word, string unitNo = "00", string ResponseWaitTime = "0") /// fins协议写CIO public string WriteCIO_Fins(int Addr, string sendData, finsDataTypeEnum dataType = finsDataTypeEnum.Bit, string unitNo = "00", string ResponseWaitTime = "0") /// fins协议写W区 public string WriteW_Fins(int Addr, string sendData, finsDataTypeEnum dataType = finsDataTypeEnum.Word, string unitNo = "00", string ResponseWaitTime = "0") /// fins协议写H区 public string WriteH_Fins(int Addr, string sendData, finsDataTypeEnum dataType = finsDataTypeEnum.Word, string unitNo = "00", string ResponseWaitTime = "0") /// fins协议写T区 public string WriteT_Fins(int Addr, string sendData, finsDataTypeEnum dataType = finsDataTypeEnum.CompletionFlag, string unitNo = "00", string ResponseWaitTime = "0") /// fins协议写A区 public string WriteA_Fins(int Addr, string sendData, finsDataTypeEnum dataType = finsDataTypeEnum.CompletionFlag, string unitNo = "00", string ResponseWaitTime = "0") /// 欧姆hostlink通讯协议计算校验码fcs public string fcs(string Str) /// 从fins结果串中提取结果值,例如结果串为@00FA004000000001010000 6162 40* 则本函数提取值为6162 public string getValueFromFinsStr(string finsString) /// 将plc内存的十六进制字(两个字)转为32位的浮点数 public float getFloat32(string data) /// 把十六进制串转为二进制字符串 public static string toBinary(string ox) /// 读CIO /// </summary> /// <param name="cioAddr">CIO地址,比如101</param> /// <param name="ioList">IO的位列表,比如CIO为101, 你想取101.0,101.3的状态,则传入{0,3}</param> public List<ushort> readCIO(string cioAddr, List<int> ioList)
参考例子:
using netMarketing.automation.plc; using netMarketing.ConvertAbout; using sharClass; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using static netMarketing.automation.plc.OmronPlc; namespace omonPlcTest { public partial class Form1 : Form { private OmronPlc plc; public Form1() { InitializeComponent(); } private void btnRead_Click(object sender, EventArgs e) { if (null != plc) { int index = this.cbxType.SelectedIndex; var res = string.Empty; var datatype = this.cbxBitOrWord1.SelectedIndex; try { switch (index) { case 0: //CIO res = plc.ReadCIO_Fins(ConvertHelper.ToInt32(tbAddress.Text, 0), ConvertHelper.ToInt32(tbReadSum.Text, 1),new enumHelper<finsDataTypeEnum>().valueToEnum(datatype)); break; case 1: //DM res = plc.ReadDM_Fins(ConvertHelper.ToInt32(tbAddress.Text, 0), ConvertHelper.ToInt32(tbReadSum.Text, 1), new enumHelper<finsDataTypeEnum>().valueToEnum(datatype)); break; case 2: //W res = plc.ReadW_Fins(ConvertHelper.ToInt32(tbAddress.Text, 0), ConvertHelper.ToInt32(tbReadSum.Text, 1), new enumHelper<finsDataTypeEnum>().valueToEnum(datatype)); break; case 3: //H res = plc.ReadH_Fins(ConvertHelper.ToInt32(tbAddress.Text, 0), ConvertHelper.ToInt32(tbReadSum.Text, 1), new enumHelper<finsDataTypeEnum>().valueToEnum(datatype)); break; case 4: //T res = plc.ReadT_Fins(ConvertHelper.ToInt32(tbAddress.Text, 0), ConvertHelper.ToInt32(tbReadSum.Text, 1), new enumHelper<finsDataTypeEnum>().valueToEnum(datatype)); break; case 5: //A res = plc.ReadA_Fins(ConvertHelper.ToInt32(tbAddress.Text, 0), ConvertHelper.ToInt32(tbReadSum.Text, 1), new enumHelper<finsDataTypeEnum>().valueToEnum(datatype)); break; } rtbMsg.AppendText(res + Environment.NewLine); } catch(Exception ex) { MessageBox.Show(ex.Message); } } else { MessageBox.Show("先连接plc!"); } } private void button1_Click(object sender, EventArgs e) { if (tbAddress2.Text.Length < 1 || tbwriteContent.Text.Length < 1) return; if (null != plc) { try { int index = this.cbxType2.SelectedIndex; var res = string.Empty; var datatype = this.cbxBitOrWord2.SelectedIndex; switch (index) { case 0: //CIO res = plc.WriteCIO_Fins(ConvertHelper.ToInt32(tbAddress2.Text, 0), tbwriteContent.Text, new enumHelper<finsDataTypeEnum>().valueToEnum(datatype)); break; case 1: //DM res = plc.WriteDM_Fins(ConvertHelper.ToInt32(tbAddress2.Text, 0), tbwriteContent.Text, new enumHelper<finsDataTypeEnum>().valueToEnum(datatype)); break; case 2: //W res = plc.WriteW_Fins(ConvertHelper.ToInt32(tbAddress2.Text, 0), tbwriteContent.Text, new enumHelper<finsDataTypeEnum>().valueToEnum(datatype)); break; case 3: //H res = plc.WriteH_Fins(ConvertHelper.ToInt32(tbAddress2.Text, 0), tbwriteContent.Text, new enumHelper<finsDataTypeEnum>().valueToEnum(datatype)); break; case 4: //T res = plc.WriteT_Fins(ConvertHelper.ToInt32(tbAddress2.Text, 0), tbwriteContent.Text, new enumHelper<finsDataTypeEnum>().valueToEnum(datatype)); break; case 5: //A res = plc.WriteA_Fins(ConvertHelper.ToInt32(tbAddress2.Text, 0), tbwriteContent.Text, new enumHelper<finsDataTypeEnum>().valueToEnum(datatype)); break; } if (res.Length > 0) rtbmsg2.AppendText(res); else rtbmsg2.AppendText("OK\r\n"); } catch (Exception ex) { MessageBox.Show(ex.Message); } } } private void button2_Click(object sender, EventArgs e) { try { plc = new OmronPlc(tbComConfig.Text); MessageBox.Show("open ok!"); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void Form1_Load1(object sender, EventArgs e) { var datatypeAry = new enumHelper<finsDataTypeEnum>().getEnumItemArray(); var areaTypeAry = new enumHelper<finsAreaTypeEnum>().getEnumItemArray(); cbxType2.DataSource = cbxType.DataSource = areaTypeAry; cbxBitOrWord1.DataSource = cbxBitOrWord2.DataSource = datatypeAry; cbxType.SelectedIndex = 1; cbxType2.SelectedIndex = 1; cbxBitOrWord1.SelectedIndex = 1; cbxBitOrWord2.SelectedIndex = 1; } private void Form1_Shown(object sender, EventArgs e) { } } }
读内存举例:
(1) 读CIO 101,假设101.0, 101.1 为点亮为1, 其它位为0
内存类型为CIO,数据类型为Bit,地址为101,读取数量为2
@00FA004000000001010000010143*
内存类型为CIO,数据类型为Word,地址为101,读取数量为1
@00FA004000000001010000000340*
勇哥把结果用红色标记出来了。
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

