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

news/2024/10/4 6:44:17

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

  • new一个PLC对象
        //idenfy basic link paramsprivate 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
        //connectpublic 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;}}//disconnectedpublic 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协议封装的,这里不深究
            //task1Task.Run(() =>{while (true){if (my_plc_status){//read from plcdata_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 typepublic delegate void setTextCallBack(string val);public delegate void setRadioCallBack(bool status);//2.delegate functionpublic 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_readpublic 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_writepublic 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 IIpublic 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: 32Bool_var: falsetest_data2:  #Class II 二级class名称,和程序对应Int_var: 99Char_var: 'a'
  • 示意如图:

  • 引用yaml,在load事件中读取yaml文件默认配置

yaml_data my_yaml_data = new yaml_data();
Config_yaml my_yaml= new Config_yaml();
my_yaml_data = my_yaml.Yaml_read<yaml_data>("C:\\Users\\testyaml.yaml");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/29004.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

三角函数之诱导公式

壹如上图: \[\begin{eqnarray} 已知: \enspace AC=\sin\alpha,BC=\cos\alpha \\ \\ \\ \sin\left(\frac{\pi}{2}-\alpha\right)=\frac{AD}{AB}=\frac{BC}{AB}=\cos\alpha \\ \\ 诱导公式组0.1: \enspace \sin\left(\frac{\pi}{2}-\alpha\right)=\cos\alpha \\ \\ \\ \cos\left(…

ubuntu下多jdk环境轻松却换

在实际coding生活中,维护老项目与开发新项目常是并行的。快速企业java开发jdk版本,收首先要解决的问题。 今天看到一篇Blog,参考配置后完美实现了一键快速切换,nice!!!!!! 环境: 1、ubuntu 22 2、openjdk1.8、openjdk17 具体操作步骤: 1、安装openjdk(略),安装位…

CentOS 7 部署 NET6.0 项目过程

1、环境配置NET6.0 环境搭建主要是SDK 和 runtime 的安装,下图截自官网说明了SDK 和 runtime 的关系CentOS7 安装SDK 方法第一步:rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm第二部:yum install dotnet-sdk-6.0也可以只安装对应的…

细说夜莺监控系统告警自愈机制

虽说监控系统最侧重的功能是指标采集、存储、分析、告警,为了能够快速恢复故障,告警自愈机制也是需要重点投入建设的,所有可以固化为脚本的应急预案都可以使用告警自愈机制来快速驱动。夜莺开源项目从 v7 版本开始内置了告警自愈模块,本文将详细介绍告警自愈的原理和实现。…

程序员副业创富:业余时间解锁首笔财富里程碑

在这个充满机遇的数字时代,我,一个普通的程序猿,编程爱好者,终于在云端源想这个平台上收获了属于我的第一桶金。这是一个关于兼职、学习与成长的故事,希望能激发同在编程路上的你,勇敢迈出那一步。 先晒晒我的首笔收入:一个普通的周末,我像往常一样,泡上一杯咖啡,坐在…

(一)文本分类经典模型之CNN篇

这篇blog对NLP领域的基本任务文本分类的CNN经典模型做了梳理CNN源于计算机视觉研究,后来诸多学者将其应用于短文本分类,其基本结构如下图所示:由上图可知,基于CNN的短文本分类模型,通常包括输入层、卷积层、池化层、全连接层和输出层五部分,其中卷积层和池化层是最为关键…

Apache DolphinScheduler 3.3.0 版本重磅更新提前看!

Apache DolphinScheduler 3.3.0版本终于要在万众期待中发布啦!本次发版将有重大功能更新,包括架构上的调整。 为了让广大用户提前尝鲜,社区特别准备了直播活动提前揭秘3.3.0版本中的重要更新,到时候你将会了解到这些信息:3.3.0版本的工作流引擎改进 任务执行流程的优化 架…

【触想智能】工业级平板电脑五大特征与应用领域分析

工业级平板电脑是专供工业环境使用的工业控制计算机,也被称为工控一体机。工业级平板电脑基本性能及兼容性与商用平板电脑几乎相同,但是工业级平板电脑更注重在不同环境下的稳定性能,因此,工业级平板电脑与普通的商用平板电脑存在一定的区别。一、工业级平板电脑的五大特征…