C#上位机与欧姆龙PLC的通信09----开发专用的通讯工具软件(Winform版)

news2024/11/17 1:40:25

1、介绍

上节文章已经完成了通讯库的开发,可以看到库还是蛮厉害的,在项目中就可以直接拿来应用,这节要做的就是做一个工具软件,形成自己专业的通讯工具,也是对通讯库的直接利用,本节要写的工具软件是一个winform程序,因为控制台程序是单调的,不方便操作,不直观。

 2、开始干

1、添加窗体程序

2、引用通讯库文件.dll

将上节生成的dll文件复制到本项目中

 

 3、连接代码

using Omron.Communimcation.Fins.Omron;
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;

namespace OmronFinsFormApp
{
    public partial class Form1 : Form
    {

        /// <summary>
        /// finstcp对象
        /// </summary>
        FinsTcp finsTcp;

        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 连接Plc
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnOpen_Click(object sender, EventArgs e)
        {
            string ip = txtIPAddress.Text.Trim();
            string port = txtPort.Text.Trim();
            finsTcp = new FinsTcp(ip, Convert.ToInt32(port), (byte)10, (byte)04);// 创建连接 
            var result = finsTcp.Connect();// 开始连接PLC
            if (!result.IsSuccessed)
            {
                MessageBox.Show(result.Message);
                return;
            }
            lblMessage.Text = "PLC连接成功";
            SetTextDisable(true);
            this.btnOpen.Enabled = false;
            this.btnClose.Enabled = true;
        }

        private void SetTextDisable(bool v)
        {
            txtIPAddress.ReadOnly = v;
            txtPort.ReadOnly = v;
        }

    }
}

4、读取代码

  /// <summary>
  /// 读取数据
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void myread_Click(object sender, EventArgs e)
  { 
      //内存地址
      string plcAddr = txtMemoryAddr.Text.Trim( ); 
      //读取数量
      ushort readCount = ushort.Parse(txtRCount.Text.Trim( ));
      //数据类型
      string dataType = cbodatatype.Text.Trim();
      switch (dataType)
      {
          case "ushort":
              var datas= finsTcp.Read<ushort>(plcAddr, readCount);
              if (!datas.IsSuccessed)
              {
                  MessageBox.Show(datas.Message);
                  return;
              }
              txtReadDatas1.Text = string.Join(",", datas.Datas);
              break;
          case "short":
              var datas2 = finsTcp.Read<short>(plcAddr, readCount);
              if (!datas2.IsSuccessed)
              {
                  MessageBox.Show(datas2.Message);
                  return;
              }
              txtReadDatas2.Text = string.Join(",", datas2.Datas);
              break;
          case "float":
              var datas3 = finsTcp.Read<float>(plcAddr, readCount);
              if (!datas3.IsSuccessed)
              {
                  MessageBox.Show(datas3.Message);
                  return;
              }
              txtReadDatas3.Text = string.Join(",", datas3.Datas);
              break;
          case "bool":
              var datas4 = finsTcp.Read<bool>(plcAddr, readCount);
              if (!datas4.IsSuccessed)
              {
                  MessageBox.Show(datas4.Message);
                  return;
              }
              txtReadDatas4.Text = string.Join(",", datas4.Datas);
              break;
      }
  }

 

 

 通讯报文 

5、写入代码

  /// <summary>
  /// 写入数据
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void btnWrite_Click(object sender, EventArgs e)
  {
      //PLC地址
      string plcAddr = txtWPLCAddr.Text.Trim();
      //数据类型
      string dataType = cmddatatype2.Text.Trim();
      //实际数量
      string objWriteVals = "";
      switch (dataType)
      {
          case "ushort":
              objWriteVals = txtWriteDatas1.Text.Trim();
              break;
          case "short":
              objWriteVals = txtWriteDatas2.Text.Trim();
              break;
          case "float":
              objWriteVals = txtWriteDatas3.Text.Trim();
              break;
          case "bool":
              objWriteVals = txtWriteDatas4.Text.Trim();
              break;
      }
      //写入数量
      ushort writeCount = ushort.Parse(txtWPLCCount.Text.Trim());
      ushort objWCount = (ushort)objWriteVals.Split(',').Length;
      //实际数量与要求数量不一致,不允许操作
      if (writeCount != objWCount)
      {
          MessageBox.Show("写入值的数量不正确!");
          return;
      }
      List<string> vals = objWriteVals.Split(',').ToList();
      switch (dataType)
      {
          case "ushort":
              //实际数值转换成list集合ushort类型
              List<ushort> objushort = new List<ushort>();
              vals.ForEach((x) =>
              {
                  objushort.Add(ushort.Parse(x));
              });
              var finish1 = finsTcp.Write<ushort>(objushort, plcAddr);
              if (finish1.IsSuccessed)
              {
                  MessageBox.Show(finish1.Message);
              }
              break;
          case "short":
              //实际数值转换成list集合 short类型
              List<short> objshort = new List<short>();
              vals.ForEach((x) =>
              {
                  objshort.Add(short.Parse(x));
              });
              var finish2 = finsTcp.Write<short>(objshort, plcAddr);
              if (finish2.IsSuccessed)
              {
                  MessageBox.Show(finish2.Message);
              }
              break;
          case "float":
              //实际数值转换成list集合 float
              List<float> objfloat = new List<float>();
              vals.ForEach((x) =>
              {
                  objfloat.Add(float.Parse(x));
              });
              var finish3 = finsTcp.Write<float>(objfloat, plcAddr);
              if (finish3.IsSuccessed)
              {
                  MessageBox.Show(finish3.Message);
              }
              break;
          case "bool":
              //实际数值转换成list集合bool
              List<bool> objbool = new List<bool>();
              vals.ForEach((x) =>
              {
                  if (x == "1")
                  {
                      objbool.Add(true);
                  }
                  else
                  {
                      objbool.Add(false);
                  }
              });
              var finish4 = finsTcp.Write<bool>(objbool, plcAddr);
              if (finish4.IsSuccessed)
              {
                  MessageBox.Show(finish4.Message);
              }
              break;
      }
  }

 

 

 

 

 

最后看下报文

3、小结

通讯库100%正确,实现了bool,ushort,short,float类型数据的读取和写入,可以看到封装得超爽,有这个工具,到项目开发中就可以用得上这个工具软件,用来调试测试PLC程序,打通与电气工程师的通讯数据,超强啊。

写作不易,图文不易,思路不易,打字不易,分享不易,多多点赞。

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

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

相关文章

数据采集:获取有价值信息的关键步骤

在当今数据驱动的时代&#xff0c;数据已成为企业、组织和个人做出明智决策的重要依据。而数据采集作为数据分析和应用的第一步&#xff0c;其重要性不言而喻。本文将探讨数据采集的概念意义、方法工具、面临的挑战和应对策略以及注意事项。 一、数据采集的定义和重要性 &…

【docker】一文讲完docker搭建私有仓库

一、docker搭建私有仓库方法总结 搭建Docker私有仓库主要有以下几种方式&#xff1a; 使用Docker官方提供的Registry镜像&#xff1a;Docker官方提供了一个用于构建私有镜像仓库的Registry镜像&#xff0c;只需将镜像下载并运行容器&#xff0c;然后暴露5000端口即可使用。可以…

【mysql】报错1349 - View‘s SELECT contains a subquery in the FROM clause

操作 创建视图的sql语句中有不支持子查询 mysql创建视图 select * from (select name,age from table_name where 11 and namea ) tb where 11 and type1问题 报错1349 - View’s SELECT contains a subquery in the FROM clause 原因 原因创建视图的sql语句中有不支持子查…

2023 | 美团技术团队热门技术文章汇总

新年好&#xff01;时光飞逝&#xff0c;我们告别了难忘的2023&#xff0c;迎来了充满希望的2024。再次感谢大家的一路相伴~~ 今天&#xff0c;我们整理了2023年公众号阅读量靠前的10篇技术文章&#xff0c;欢迎大家品阅。祝愿大家在新的一年里&#xff0c;幸福平安&#xff0…

LLM 中的长文本问题

近期,随着大模型技术的发展,长文本问题逐渐成为热门且关键的问题,不妨简单梳理一下近期出现的典型的长文本模型: 10 月上旬,Moonshot AI 的 Kimi Chat 问世,这是首个支持 20 万汉字输入的智能助手产品; 10 月下旬,百川智能发布 Baichuan2-192K 长窗口大模型,相当于一次…

arr.prototype 数组的方法

1.forEach 作用:遍历这个数组 代码&#xff1a; let arr [10, 20, 30, 40, 50];arr.forEach((item) > {console.log(item);}); 返回值:没有返回值 2.fiflter 作用:过滤数组 代码&#xff1a; let arr [10, 20, 30, 40, 50];let newArr arr.filter((item) > {retu…

Go语言中的HTTP请求和响应处理

在Web开发中&#xff0c;HTTP请求和响应是核心的交互方式。Go语言&#xff0c;作为一种高效且现代的编程语言&#xff0c;为开发者提供了简洁、强大的工具来处理HTTP请求和响应。本文将简要介绍在Go语言中如何处理HTTP请求和响应。 在Go语言中&#xff0c;HTTP请求和响应的处理…

Dart调用JS对10000条定位数据滤波

使用Dart调用JS&#xff0c;还是为了练习跨语言调用&#xff1b; 一、编写对应的JS代码 平时在开发时不推荐将算法放在JS里&#xff0c;我这里是简单的做一下数据过滤&#xff1b; 首先生成一些随机定位数据&#xff0c;在实际开发中可以使用真实数据&#xff1b; // 随机定…

ROS学习笔记(9)进一步深入了解ROS第三步

0.前提 1. (C)Why did you include the header file of the message file instead of the message file itself?&#xff08;为包含消息的头文件而不是消息本身&#xff1f;&#xff09; 回答&#xff1a;msg文件是描述ROS消息字段的文本文件&#xff0c;用于生成不同语言消息…

【亚马逊云科技】自家的AI助手 - Amazon Q

写在前面&#xff1a;博主是一只经过实战开发历练后投身培训事业的“小山猪”&#xff0c;昵称取自动画片《狮子王》中的“彭彭”&#xff0c;总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域&#xff0c;如今终有小成…

生活中的物理3——神奇陷阱(随机倒下的抽屉柜门)

1实验 材料&#xff1a;大自然&#xff08;风&#xff09;、抽屉门松掉的抽屉 实验 1、找一个大风的日子&#xff0c;打开窗户&#xff08;不要找下雨天&#xff0c;不然你会被你亲爱的嫲嫲KO&#xff09; 2、让风在抽屉面前刮过 3、你发现了什么&#xff1f;&#xff1f;&…

毛戈平公司上市终止:产品依赖代工,研发投入低,毛戈平夫妇套现

时隔一年&#xff0c;毛戈平化妆品股份有限公司&#xff08;下称“毛戈平”或“毛戈平公司”&#xff09;在A股的上市之旅再次宣告终止。 据贝多财经了解&#xff0c;毛戈平公司最早于2016年12月预披露招股书&#xff0c;准备在上海证券交易所上市&#xff0c;原计划募资5.12亿…

防火安全球阀,到2027年市场增长至68亿美元

防火安全球阀是一种在火灾、爆炸等危险环境下仍能正常使用的阀门。它被广泛用于石化、化工、船舶、电力等领域&#xff0c;以保障生产和人员安全。下面我们将从全球市场和中国市场两个方面对其发展趋势进行分析。全球市场分析&#xff1a; 从全球市场的角度来看&#xff0c;防火…

【linux】更改infiniband卡在Debian系统的网络接口名

在Debian或任何其他基于Linux的系统中&#xff0c;网络接口的名称由udev系统管理。通过创建udev规则&#xff0c;可以修改网络接口名称。以下是更改InfiniBand卡接口名称的一般步骤&#xff1a; 1. 找到网络接口的属性&#xff0c;以编写匹配的udev规则 可以使用udevadm命令查…

[每周一更]-(第55期):Go的interface

参考地址 https://juejin.cn/post/6978322067775029261https://gobyexample.com/interfaceshttps://go.dev/tour/methods/9 介绍下Go的interface 在Go语言中&#xff0c;interface是一种特殊的数据类型&#xff0c;用于定义一组方法的规范。它描述了一个对象可以具备的行为&…

Android ValueAnimator属性动画ObjectAnimator使View颜色渐变,Kotlin

Android ValueAnimator属性动画ObjectAnimator使View颜色渐变&#xff0c;Kotlin 设置背景颜色渐变&#xff1a; private var iv: ImageView? nulloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activit…

图表征模型研究

图表征对于知识图谱是很重要的&#xff0c;如何将图进行embedding&#xff0c;并输入到深度学习模型中&#xff0c;是一个热点问题。 1. GraphSage模型 主要应用于同构图中&#xff0c;是一种归纳式的图表征模型&#xff0c;首先从一个图中训练出embedding方法&#xff0c;在…

创意与技术的结晶:AI魔法绘图与中文描述的完美结合

在人类文明的长河中&#xff0c;创意与技术一直是推动发展的重要动力。随着科技的日新月异&#xff0c;人工智能&#xff08;AI&#xff09;在创意领域的应用逐渐崭露头角&#xff0c;而AI魔法绘图与中文描述的结合&#xff0c;更是将这一趋势推向了新的高度。AI魔法绘图是一种…

解决uniapp打包成apk后uni.getStorageSync获取不到值

uniapp写的项目&#xff0c;在hbuilderx中云打包成apk后我在登录存储的token死都获取不到&#xff0c;导致后续接口请求头没有token连接不到接口&#xff0c;只有运行到手机或者模拟器还有打包成apk后是获取不到&#xff0c;其他的小程序还有网页都可以获取到 试过了很多种方法…

[蓝桥杯学习]​树上差分

差分 前缀和 sum_i sum_i-1 a_i 差分 diff_i a_i - a_i-1 差分的好处 点的差分 问题引入 解决问题 要用到差分的思想&#xff0c;每次从叶子向上的回溯&#xff0c;让父结点子结点的cnt值&#xff0c;但是仅仅这样&#xff0c;还不行 回溯的过程中&#xff0c;LCA被加…