命名空间: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
版权声明:本文为博主原创文章,转载请附上博文链接!


少有人走的路


















