首页 > 编程语言 >C#与PLC变量在数据交互上的一些探索

C#与PLC变量在数据交互上的一些探索

时间:2024-05-08 17:22:06浏览次数:23  
标签:C# my yaml PLC var plc bool 交互 public

1. 基于C#的数据交互
A. S7using S7.Net,后文读写数据时二次封装过S7协议,这里暂且不表,只列举S7协议最原始的应用。

  • new一个PLC对象
        //idenfy basic link params
        private string plc_ip;
        private CpuType plc_type;
        private short plc_rack, plc_slot;
        public Plc my_plc;

my_plc = new Plc(plc_type, plc_ip, plc_rack, plc_slot);
  • 连接和断开PLC
        //connect
        public bool connect_plc()
        {
            try
            {
                my_plc.Open();
            }
            catch
            {
                MessageBox.Show("plc can't be connected,check params!");
            }
            if (my_plc.IsConnected)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        //disconnected
        public bool disconnect_plc()
        {
            my_plc.Close();
            if (my_plc.IsConnected)
            {
                return false;
            }
            else
            {
                return true;
            }
        }
  • 读写数据,S7_registertype是PLC的寄存器地址类型,如DB,M,I,Q,T,C等。S7_datatype是自己提前封装好的bool,byte,word,int等等这一类基础数据类型
//写bool,bool由byte数组的位寻址而来,bit_address就是数组下标
my_plc.WriteBit(S7_registertype, iDB_num, iDB_start_byteadd, bit_address, (bool)values);
//写非bool
my_plc.Write(S7_registertype, iDB_num, iDB_start_byteadd, values);
//读,count是计数单位,一般写1,以一个byte作为最小计算单位
my_plc.Read(S7_registertype, iDB_num, iDB_start_byteadd, S7_datatyp, count);

B. 用静态变量存储PLC的交互数据

  • UI和PLC变量如下:

  • 新建static

    internal static class data_yamltest_exchange
    {
        public static byte byte_var;
        public static short word_var;
        public static bool bool_var;
    }
  • 数据交互,这里的数据二次封装过的,但是是基于上面S7协议封装的,这里不深究
            //task1
            Task.Run(() =>
            {
                while (true)
                {
                    if (my_plc_status)
                    {
                        //read from plc
                        data_yamltest_exchange.bool_var = my_s7.bool_rw_value(132, my_plc_iDB, 4, "r", 0); ;

                        //write to plc 
                        my_s7.write_read_value("word", 132, my_plc_iDB, 2, "w", data_yamltest_exchange.word_var, 0, 1);
                        my_s7.write_read_value("byte", 132, my_plc_iDB, 0, "w", data_yamltest_exchange.byte_var, 0, 1);
                    }
                }
            });
  • UI后端代码,这里用了两个委托来完成radioButton的显示
    public partial class _6Yaml_test : UserControl
    {
        public _6Yaml_test()
        {
            InitializeComponent();
            this.textBox1.Text = "0";
            this.textBox2.Text = "0";
        }
        string val = null;
        bool status = false;
        private void _6Yaml_test_Load(object sender, EventArgs e)
        {
            Task.Run(() =>
            {
                setTextCallBack sV = new setTextCallBack(setValue);
                setRadioCallBack rV = new setRadioCallBack(setStatus);
                while (true)
                {
                    if (data_yamltest_exchange.bool_var == true)
                    {
                        status = true;
                        val = "bool have been enabled";
                        radioButton1.Invoke(sV, val);
                        radioButton1.Invoke(rV, status);
                    }
                    else
                    {
                        status = false;
                        val = "bool have been disabled";
                        radioButton1.Invoke(sV, val);
                        radioButton1.Invoke(rV, status);
                    }
                    try
                    {
                        data_yamltest_exchange.word_var = Convert.ToInt16(textBox2.Text.ToString());
                        data_yamltest_exchange.byte_var = Convert.ToByte(textBox1.Text.ToString());
                    }
                    catch { break; };
                }
            });
        }
        //cross-thread delivery
        //1.delegate type
        public delegate void setTextCallBack(string val);
        public delegate void setRadioCallBack(bool status);
        //2.delegate function
        public void setValue(string val)
        {
            radioButton1.Text=val;
        }
        public void setStatus(bool status)
        { 
        radioButton1.Checked = status;
        }

    }
  • 这个方法里,PLC读出的数据存储在自建的静态类里,要写入PLC变量的值也由自建的静态类给出,C#各个线程都可以访问该静态类,避免了各个线程和类之间传值的复杂和繁琐。

C. 用yaml交互

  • 安装YamlDoNet
  • 引用命名空间
using YamlDotNet.Serialization;
  • 新建文件夹,新建.yaml文件,建立yaml结构

  • 读取yaml文件方法

        //yaml_read
        public T Yaml_read<T>(string file_path)
        { 
        var deserializer = new DeserializerBuilder().Build();
            T my_yamlObject;
            using (var reader = new StreamReader(file_path))
            { 
            my_yamlObject=deserializer.Deserialize<T>(reader);
            }
            return my_yamlObject;
        }
  • 写入yaml文件方法
        //yaml_write
        public void Yaml_write(object obj, string file_path)
        { 
        var serializer = new SerializerBuilder().WithNamingConvention(CamelCaseNamingConvention.Instance).Build();
            var my_yaml = serializer.Serialize(obj);
            File.WriteAllText(file_path, my_yaml);
        }
  • 建立和yaml结构一致的class结构这是重点
    • [YamlMember(Alias)=""]来指定yaml文件中的结构名]
    • [YamlIgnore]用于在序列化或者反序列化的时候忽略掉它
    • [YamlMember(Order = 1)]用于指定序列化的顺序
    • {get;set;}用于设置yaml结构的属性,公有属性。yaml文件的结构本身就相当于被保护起来的一个私有字段
    • yaml文件中不要用table键缩进,会报错,缩进一般使用空格,敲两个或者四个空格
    • yaml内容的结构名,和实际程序里面必须一一对应,一字不差
  • 建立yaml文件需要的程序结构样例
    //yaml结构
    public class yaml_data
    {
        public class yaml_test_data1
        {
            [YamlMember(Alias = "Byte_var")]
            public byte Byte_var { get; set; }
            [YamlMember(Alias = "Word_var")]
            public short Word_var { get; set; }
            [YamlMember(Alias = "Bool_var")]
            public bool Bool_var { get; set; }
        }
        public class yaml_test_data2
        {
            [YamlMember(Alias = "Int_var")]
            public int Int_var { get; set; }
            [YamlMember(Alias = "Char_var")]
            public char Char_var { get; set; }
        }

        // Class II
        public class yamal_class_collection
        {
            [YamlMember(Alias = "test_data1")]
            public yaml_test_data1 test_data1 { get; set; }

            [YamlMember(Alias = "test_data2")]
            public yaml_test_data2 test_data2 { get; set; }
        }

        //Class I
        [YamlMember(Alias="data_collection")]
        public yamal_class_collection data_collection { get; set; }
    }
  • 建立yaml文件内容,注意上下对应
data_collection:  #Class I 一级class名称,和程序对应
  test_data1:  #Class II 二级class名称,和程序对应
    Byte_var: 0x10  #各个字段
    Word_var: 32
    Bool_var: false
    
  test_data2:  #Class II 二级class名称,和程序对应
    Int_var: 99
    Char_var: 'a'
  • 示意如图:

标签:C#,my,yaml,PLC,var,plc,bool,交互,public
From: https://www.cnblogs.com/xiacuncun/p/18179132

相关文章

  • CentOS 7 部署 NET6.0 项目过程
    1、环境配置NET6.0环境搭建主要是SDK和runtime的安装,下图截自官网说明了SDK和runtime的关系   CentOS7安装SDK方法第一步:rpm-Uvhhttps://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm第二部:yuminstalldotnet-sd......
  • 131. 分割回文串-c++
    给你一个字符串s,请你将s分割成一些子串,使每个子串都是回文串。返回s所有可能的分割方案。示例1:输入:s="aab"输出:[["a","a","b"],["aa","b"]]示例2:输入:s="a"输出:[["a"]]classSolution{public:vector<vector......
  • ssl check 工具以及参考命令
    有时我们希望对于ssl进行一些信息的查看,以下是一些工具,以及参考使用命令nmapnmap--scriptssl-enum-ciphers-p5671possum.lmq.cloudamqp.comopensslopenssls_client-connectpossum.lmq.cloudamqp.com:5671-servernamepossum.lmq.cloudam......
  • SciTech-BigDataAIML-Tensorflow-Keras是用在Tensorflow的高层API
    [https://tensorflow.google.cn/guide/keras](Keras:Thehigh-levelAPIforTensorFlow)https://tensorflow.google.cn/guide/kerasThecoredatastructuresofKerasarelayersandmodels.Alayerisasimpleinput/outputtransformation,andamodelisadirec......
  • Oracle常用函数
    计算字符串长度--函数:length()--参数:字段或者字符串SELECTLENGTHb('克峰同学')FROMdual--返回数字4计算字符串字节长度--函数:lengthb()--参数:字段或者字符串--汉字占两个字节,数字和字母占一个字节SELECTLENGTHb('克峰同学')FROMdual--返回数字8......
  • Oracle 数据库执行提示:ORA-00054
    报错信息:中文:英文:ORA-00054:resourcebusyandacquirewithNOWAITspecifiedortimeoutexpired分析:资源忙,被占用了。故障处理1.检查哪个用户占用资源selectloc.session_id,obj.owner,obj.object_namefromv$locked_objectloc,dba_objectsobjwhereloc.object_id......
  • SCC缩点
    一、P2812校园网络【[USACO]NetworkofSchools加强版】P2812校园网络【[USACO]NetworkofSchools加强版】1、算法简析首先,建立一张有向图——学校是节点,学校间的单向线路是有向边。\(Q_1\):选出若干个节点,从这些节点出发可以到达其它的任意节点(即不考虑选出的节点),求这些节点......
  • [BJDCTF2020]EzPHP 审计绕过
    今天来个难点的题。点击查看代码<?phphighlight_file(__FILE__);error_reporting(0);$file="1nD3x.php";$shana=$_GET['shana'];$passwd=$_GET['passwd'];$arg='';$code='';echo"<br/><font......
  • (一)文本分类经典模型之CNN篇
    CNN源于计算机视觉研究,后来诸多学者将其应用于短文本分类,其基本结构如下图所示:由上图可知,基于CNN的短文本分类模型,通常包括输入层、卷积层、池化层、全连接层和输出层五部分,其中卷积层和池化层是最为关键的特征提取环节。卷积层通过构造二维卷积核,并将其上下移动,在卷积窗口内与......
  • c# Dictionary<TKey,TValue>.TryAdd
    原文链接:https://learn.microsoft.com/zh-cn/dotnet/fundamentals/code-analysis/quality-rules/ca1864Dictionary<TKey,TValue>.ContainsKey(TKey) 和 Dictionary<TKey,TValue>.Add 都执行查找操作,这是冗余设置。如果字典中已存在键,Dictionary<TKey,TValue>.Add 也会引发异......