[netMarketing类库] OmronPlc类:基于欧姆龙RS232 Host Link Fins协议通讯类

命名空间: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)
        {
          
        }
    }
}


image.png

image.png  image.png

image.png


读内存举例:

(1) 读CIO 101,假设101.0, 101.1 为点亮为1, 其它位为0


内存类型为CIO,数据类型为Bit,地址为101,读取数量为2

@00FA004000000001010000010143*

内存类型为CIO,数据类型为Word,地址为101,读取数量为1

@00FA004000000001010000000340*

勇哥把结果用红色标记出来了。


image.png


--------------------- 

作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

返回类库功能说明目录



本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:
  • 评论列表:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年3月    »
123
45678910
11121314151617
18192021222324
25262728293031
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864