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

本文主要是介绍C#上位机与欧姆龙PLC的通信09----开发专用的通讯工具软件(Winform版),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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();// 开始连接PLCif (!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集合 floatList<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集合boolList<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程序,打通与电气工程师的通讯数据,超强啊。

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

这篇关于C#上位机与欧姆龙PLC的通信09----开发专用的通讯工具软件(Winform版)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/574699

相关文章

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

C#基础之委托详解(Delegate)

《C#基础之委托详解(Delegate)》:本文主要介绍C#基础之委托(Delegate),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 委托定义2. 委托实例化3. 多播委托(Multicast Delegates)4. 委托的用途事件处理回调函数LINQ

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调