西门子PLC与C#程序的S7.net通信

1、导入S7.net通信文件:打开工具->NuGet包管理器->管理解决方案得NuGet程序包,入下图搜索S7,安装S7netplus。
在这里插入图片描述
在这里插入图片描述
在程序中引用S7.Net文件
在这里插入图片描述
建立西门子PLC类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using S7.Net;namespace 相机打开
{class SiemensPLC{//构造函数public SiemensPLC(){_plc = new Plc((CpuType)_plcType, _ipAddress, _crack, _slot);//_plc = new Plc(CpuType.S71500, _ipAddress, _crack, _slot);}/// <summary>/// PLC类型:S7200=0;Logo0BA8=1;S7200Smart=2;S7300=10,S7400=20;S71200=30;S71500=40;/// </summary>public int PLCType { get => _plcType; set => _plcType = value; }/// <summary>/// IP地址/// </summary>public string IpAdress { get => _ipAddress; set => IpAdress = value; }/// <summary>/// 机架/// </summary>public short Crack { get => _crack; set => _crack = value; }/// <summary>/// 槽/// </summary>public short Slot { get => _slot; set => _slot = value; }int _plcType=40;string _ipAddress="192.168.1.12";short _crack = 0;short _slot = 1;Plc _plc;/// <summary>/// PLC连接状态/// </summary>/// <returns></returns>public bool ConnectState { get => _plc.IsConnected; }/// <summary>/// PLC连接/// </summary>public void Connect(){try{_plc.Open();}catch(Exception ex){MessageBox.Show("PLC连接失败:"+ex.Message.ToString());}}/// <summary>/// 连接/// </summary>public void Disconnect(){try{_plc.Close();}catch (Exception ex){MessageBox.Show("PLC断开失败:" + ex.Message.ToString());}}/// <summary>/// 读取/// </summary>/// <param name="varName"></param>/// <returns></returns>public object Read(string varName,string varType){try{switch(varType){case "布尔":case "整数":return _plc.Read(varName);case "实数":return ((uint)_plc.Read(varName)).ConvertToFloat();case "字符":int dblength = varName.IndexOf(':') - 2;//DB号的长度int db = Convert.ToInt32(varName.Substring(2, dblength));//DB号int adrlength = varName.Length - varName.IndexOf(':') - 1;//startByteAdr的长度int startByteAddress = Convert.ToInt32(varName.Substring(varName.IndexOf(':') + 1, adrlength));//startByteAdrvar count = (byte)_plc.Read(DataType.DataBlock, db, startByteAddress, VarType.Byte, 1);return (string)_plc.Read(DataType.DataBlock, db, startByteAddress, VarType.S7String, count);default:return null;}                             }catch(Exception ex){MessageBox.Show("读取失败:" + ex.Message.ToString());return null;}}/// <summary>/// 写入/// </summary>/// <param name="varName"></param>/// <param name="varValue"></param>/// <param name="type"></param>位、字节、单字、双字和字符public void Write(string varName,string varValue,string type){try{switch(type){case "位":_plc.Write(varName, (varValue == "1") ? true : false);break;case "字节":_plc.Write(varName, Convert.ToByte(varValue));break;case "单字":_plc.Write(varName, Convert.ToInt16(varValue));break;case "双字":_plc.Write(varName, Convert.ToInt32(varValue));break;case "实数":_plc.Write(varName, Convert.ToSingle(varValue));break;case "字符":int dblength = varName.IndexOf(':') - 2;//DB号的长度int db = Convert.ToInt32(varName.Substring(2,dblength));//DB号int adrlength = varName.Length - varName.IndexOf(':')-1;//startByteAdr的长度int startByteAddress = Convert.ToInt32(varName.Substring(varName.IndexOf(':')+1, adrlength));//startByteAdr//var temp = System.Text.Encoding.ASCII.GetBytes(varValue);//编码var temp = System.Text.Encoding.Unicode.GetBytes(varValue);//编码var bytes = S7.Net.Types.S7String.ToByteArray(varValue, temp.Length);//字节数组_plc.WriteBytes(DataType.DataBlock, db, startByteAddress, bytes);break;default:break;}}catch(Exception ex){MessageBox.Show("写入失败:" + ex.Message.ToString());}}}
}

参考教程:https://www.cnblogs.com/xhubobo/p/14573092.html
https://www.cnblogs.com/minily/p/13324120.html
建立winform程序
在这里插入图片描述

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 System.Threading;
using S7.Net;
using HalconDotNet;
using System.Diagnostics;namespace 相机打开
{public partial class Form1 : Form{bool isMThread = false;//是否位多线程模式bool isStart = false;//线程模式启动Task collectTask;//识别子线程// Local iconic variables HObject ho_Image = null, ho_GrayImage = null;// Local control variables HTuple hv_AcqHandle = null;//相机窗口句柄HTuple hv_WindowHandle = null;//窗口句柄HTuple hv_Width = new HTuple(), hv_Height = new HTuple();//PLC变量SiemensPLC PLC = new SiemensPLC();bool connectState = false;//线程变量Thread monitorThread;public Form1(){InitializeComponent();// Default settings used in HDevelop HOperatorSet.SetSystem("width", 512);HOperatorSet.SetSystem("height", 512);if (HalconAPI.isWindows)HOperatorSet.SetSystem("use_window_thread", "true");action();}/// <summary>/// 视觉窗口初始化/// </summary>private void action(){// Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_Image);HOperatorSet.GenEmptyObj(out ho_GrayImage);//Image Acquisition 01: Code generated by Image Acquisition 01//判断窗口是否打开if(HDevWindowStack.IsOpen()){HOperatorSet.CloseWindow(HDevWindowStack.Pop());}HOperatorSet.SetWindowAttr("background_color", "black");hv_WindowHandle = this.hWindowControl1.HalconID;HOperatorSet.OpenWindow(0, 0, this.hWindowControl1.Width, this.hWindowControl1.Height, this.hWindowControl1.HalconWindow, "visible", "", out hv_WindowHandle);HDevWindowStack.Push(hv_WindowHandle);}/// <summary>/// 采用定时器方式/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void timer1_Tick(object sender, EventArgs e){if(hv_AcqHandle==null){return;}CollectImage();//图像采集}/// <summary>/// 图像采集/// </summary>private void CollectImage(){ho_Image.Dispose();if (hv_AcqHandle==null){return;}HOperatorSet.GrabImageAsync(out ho_Image, hv_AcqHandle, -1);if (HDevWindowStack.IsOpen()){HOperatorSet.DispObj(ho_Image, HDevWindowStack.GetActive());}//HOperatorSet.WaitSeconds(0.1);ho_GrayImage.Dispose();HOperatorSet.Rgb1ToGray(ho_Image, out ho_GrayImage);HOperatorSet.DispObj(ho_GrayImage, HDevWindowStack.GetActive());HOperatorSet.GetImageSize(ho_GrayImage, out hv_Width, out hv_Height);HOperatorSet.SetPart(HDevWindowStack.GetActive(), 0, 0, hv_Height, hv_Width);//HOperatorSet.WaitSeconds(0.1);}/// <summary>/// 相机打开/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btn_OpenCamera_Click(object sender, EventArgs e){//打开相机HOperatorSet.OpenFramegrabber("DirectShow", 1, 1, 0, 0, 0, 0, "default", 8, "rgb",-1, "false", "default", "[0] Integrated Camera", 0, -1, out hv_AcqHandle);HOperatorSet.GrabImageStart(hv_AcqHandle, -1);}/// <summary>/// 启动停止按钮/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btn_StartCollect_Click(object sender, EventArgs e){if(this.rdb_Timer.Checked==true){if (this.timer1.Enabled == false){this.timer1.Enabled = true;this.btn_StartCollect.Text = "停止采集";this.rdb_MThread.Enabled = false;this.rdb_Timer.Enabled = false;}else{this.timer1.Enabled = false;this.btn_StartCollect.Text = "开始采集";this.rdb_MThread.Enabled = true;this.rdb_Timer.Enabled = true;}}else if(this.rdb_MThread.Checked==true){if(this.btn_StartCollect.Text=="开始采集"){isStart = true;btn_StartCollect.Text = "停止采集";this.rdb_MThread.Enabled = false;this.rdb_Timer.Enabled = false;//实例化子线程collectTask = new Task(() =>{while (isStart){CollectImage();}});collectTask.Start();}else{this.btn_StartCollect.Text = "开始采集";this.rdb_MThread.Enabled = true;this.rdb_Timer.Enabled = true;isStart = false;}}else{MessageBox.Show("请先选择模式!");}}/// <summary>/// 关闭窗体/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Form1_FormClosing(object sender, FormClosingEventArgs e){Process.GetCurrentProcess().Kill();}private void btn_PLCConnect_Click(object sender, EventArgs e){//连接线程ThreadPool.QueueUserWorkItem(t => PLC.Connect());}/// <summary>/// 退出按钮/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btn_Exit_Click(object sender, EventArgs e){Process.GetCurrentProcess().Kill();}private void btn_Disconnect_Click(object sender, EventArgs e){//断开线程ThreadPool.QueueUserWorkItem(t => PLC.Disconnect());}private void Form1_Load(object sender, EventArgs e){//监控线程monitorThread = new Thread(monitorFunc);monitorThread.Start();}private void btn_SingleRead_Click(object sender, EventArgs e){ThreadPool.QueueUserWorkItem(t=>SingleRead());}/// <summary>/// 关闭相机/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btn_CloseCamera_Click(object sender, EventArgs e){if (collectTask.Status == TaskStatus.Running || this.timer1.Enabled == true){MessageBox.Show("请先停止采集!");return;}//关闭相机if (hv_AcqHandle != null){HOperatorSet.CloseFramegrabber(hv_AcqHandle);}ho_Image.Dispose();ho_GrayImage.Dispose();}private void btn_Write_Click(object sender, EventArgs e){ThreadPool.QueueUserWorkItem(t=>SingleWrite());}public void monitorFunc(){while(true){connectState = PLC.ConnectState;this.Invoke((MethodInvoker)delegate{lbl_ConnectState.Text = connectState ? "Connected" : "Disconnected";btn_PLCConnect.Enabled = connectState ? false : true;btn_Disconnect.Enabled = connectState ? true : false;lbl_ConState.BackColor = connectState ? Color.Lime : Color.Red;});Thread.Sleep(100);}}public void SingleRead(){           connectState = PLC.ConnectState;this.Invoke((MethodInvoker)delegate{var value = PLC.Read(tbx_RSignleName.Text.Trim(), cbx_RTypeSelect.Text.Trim());tbx_RSingleValue.Text = Convert.ToString(value);});}public void SingleWrite(){this.Invoke((MethodInvoker)delegate{PLC.Write(tbx_WSignleName.Text.Trim(), tbx_WSingleValue.Text.Trim(), cbx_WTypeSelect.Text.Trim());});}}
}

里面还包含一部分Halcon程序,最终的目的是实现PLC程序通过Halcon程序控制相机。

建立S71500PLC仿真
采用S7-PLCSIM Advanced 3.0
建立西门子博图项目
在这里插入图片描述
在这里插入图片描述
提前设置电脑的PG端口
在这里插入图片描述
在博图中建立一个DB块
在这里插入图片描述
打开西门子仿真软件
在这里插入图片描述
这个仿真软件用一段时间后就需要重启,否则博图下载程序时找不到端口,有时候还需要重新启动博图软件才能正常下载程序
在这里插入图片描述
首先连接PLC,然后给DB1.DBX0.0赋值1,观察博图的监控画面
在这里插入图片描述
在这里插入图片描述
写入成功
在这里插入图片描述
读取成功
分别尝试字节、单字、双字写入读取都顺利

实数读写
在这里插入图片描述

比较麻烦的是字符串的读取和写入
西门子PLC有两种字符串,一种是String,另一种是WString,前者是每一个字符由两个字节构成,大小为256个字节;后者是每一个字符由四个字节构成,大小为512个字节。
在这里插入图片描述

所以英文字符采用String,中文字符采用WString,虽然WString在博图中无法查看具体字符串,只能看到编码,但是不影响正常的写入和读取。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA与西门子S7 PLC通信,方式一:S7connector

背景 在公司项目中&#xff0c;需要用到和PLC进行通讯&#xff0c;经过搜索后查询到使用JAVA与PLC通信两种方式&#xff0c;测试后达到正常读写的目的&#xff0c;于是记录下学习过程。 环境 SpringSpringMVCMybatisPlus / SpringBoot PLC: 西门子 S7-1500/S7-1200(1214C) …

汇川PLC和PLC之间ModebusTCP通讯

目录 一、AM402做主站和H3U通讯 1、Modebus主站中组态配置 2、读从站寄存器配置 3、写从站寄存器配置 4、程序中使用对从站读写操作的寄存器值 &#xff08;1&#xff09;I/O映射中地址关联 &#xff08;2&#xff09;创建自定义全局变量 &#xff08;3&#xff09;程序…

倍福TwinCAT3上位机与PLC通信测试(ADS通信) 包含C#和C++代码

倍福TwinCAT3上位机与PLC通信测试(ADS通信) 包含C#和C代码 倍福TwinCAT3上位机与PLC通信测试(ADS通信) 包含C#和C代码 本次测试需要环境&#xff1a; VS2013&#xff0c;TwinCAT3&#xff08;本人版本TC31-Full-Setup.3.1.4018.16&#xff09; 代码&#xff1a;C#代码&…

C#使用S7netPlus与PLC通讯(超简单)

前言 刚接到手一个项目&#xff0c;是开发一款程序&#xff0c;要和PLC有数据交互&#xff0c;如上图&#xff0c;设备发生故障后&#xff0c;PLC会发电报&#xff0c;我们收到电报后把故障显示出来&#xff0c;同时点击解除故障&#xff0c;也会给PLC发送相对应的电报。查了蛮…

C#与西门子PLC通信上位机程序

1.该程可以实现c#与西门子全系列plc(200smart&#xff0c;300&#xff0c;400&#xff0c;1200&#xff0c;1500)的以太网s7通讯&#xff0c;通讯传输快稳定。 2.该程序采用.dll动态链接库方式&#xff0c;是最近几年才出来的一种与西门子plc通讯的方式&#xff0c;本人经过几个…

C#中使用S7.net与西门子PLC通讯

最近因为工作的原因用到了西门子PLC&#xff0c;在使用过程中一直在思考上位机和PLC的通讯问题&#xff0c;后来上网查了一下&#xff0c;找到了一个专门针对S7开发的一个.net库–《S7netPlus》&#xff0c;PLC通讯方法比较多&#xff0c;所以也是在不断地学习中&#xff0c;以…

C#调用PCHMI与西门子PLC连接通讯

文章目录 一、PCHMI环境配置二、PCHMI连接S7&#xff08;PLC&#xff09;三、标签与按钮的使用总结 一、PCHMI环境配置 创建一个新项目 打开项目属性&#xff0c;更改输出路径为"bin\binexe"下 工具箱新建个选择卡&#xff0c;我们命名为PCHMI 鼠标右键【选择项】…

第三方调试助手的与S7-1200 PLC的通信

1、概述 西门子S7-1200 PLC支持多种协议通过以太网通讯方式&#xff0c;如OPC、TCP、S7、MODBUS-TCP等。TCP方式相比其它协议&#xff0c;具有更多的灵活性&#xff0c;更快的数据响应等优点&#xff0c; 需要PLC与电脑还有其他设备进行TCP通讯&#xff0c;使用TCP调试助手与…

TIA 博图 使用 S7通讯 Put Get 对两台PLC进行通讯

1.打开设备组态-属性-找到防护与安全&#xff1a; 把允许来自远程的PUT/GET 通讯访问✔&#xff0c;两台PLC都是这样&#xff0c;把组态下载进去。 2.设备与网络中&#xff0c;用端口1把两台设备连在一起&#xff1a; 两台设备需要在同一个网段里面 3.在PLC3新建一个DB块&#…

文心一言 VS 讯飞星火 VS chatgpt (23)-- 算法导论4.2 5题

五、V.Pan 发现一种方法&#xff0c;可以用 132 464 次乘法操作完成 68 x 68 的矩阵相乘&#xff0c;发现另一种方法&#xff0c;可以用 143 640 次乘法操作完成 70 x 70 的矩阵相乘&#xff0c;还发现一种方法&#xff0c;可以用155 424次乘法操作完成 72 x 72 的矩阵相乘。当…

【Python爬虫项目实战二】Chatgpt还原验证算法-解密某宝伪知网数据接口

目录 🐱背景🐱工具🐱分析流程🐔登陆分析🐔检索分析🐔模拟HTML代码请求🐔 解析HTML🐔 再次分析🐟分析js算法🐟 拿下furl🐟拿下sfname🐟拿下sfname🐔 构造请求🐔再次瓶颈🐔分析cookie🐟 成功演示🐱总结

[云炬python3玩转机器学习]6-2模拟梯度下降法

模拟梯度下降法 In [1]: import numpy as np import matplotlib.pyplot as plt import datetime;print (Run by CYJ,,datetime.datetime.now()) In [2]: plot_x np.linspace(-1., 6., 141) plot_xOut[2]: array([-1. , -0.95, -0.9 , -0.85, -0.8 , -0.75, -0.7 , -0.65…

OneFlow源码解析:静态图与运行时

作者&#xff5c;郑建华 更新&#xff5c;许啸宇、张文骁、成诚 OneFlow静态图的训练效率远高于动态图&#xff08;eager模式&#xff09;。本文试图通过一个简单例子&#xff0c;结合v0.8.0版本的代码&#xff0c;解读一下静态图和运行时的实现机制。 在开始之前&#xff0c;建…

infer源码阅读之yolo.cu

目录 yolo.cu注意事项一、2023/3/30更新前言1.宏定义2.Norm3.后处理3.1 affine_project3.2 decode3.2.1 decode_common3.2.2 decode_v8 3.3 nms3.4 invoker 4.预处理5.decode_mask6.AffineMatrix7.InferImpl7.1 adjust_memory7.2 preprocess7.3 load7.4 forwards 8.其它9.拓展之…

【爬虫实例】从B站和某论文网站分析python爬虫的一般编写思路———To someone

问题背景 好久没写爬虫了&#xff0c;前两天友人来问我python能不能爬论文&#xff0c;能不能告诉她爬虫的基本运行原理是什么&#xff0c;跑起来是什么样子。 我一看&#xff0c;论文爬取——爬虫最实用的场景之一&#xff0c;这不拿捏&#xff1f; 于是便尝试现场演示一番。…

【Metaverse系列一】元宇宙的奥秘

你有没有想过逃离闷热的会议室&#xff0c;瞬间移动到马尔代夫的沙滩上开会&#xff1f;开完会&#xff0c;纵身跳入大海和美人鱼捉迷藏。然后一个鲤鱼打挺直冲云霄&#xff0c;进入天宫一号开展科学研究&#xff0c;发现微重力环境下韭菜的长势喜人&#xff0c;而且在特定光照…

科大讯飞版ChatGPT测评:很好很强大

大家好&#xff0c;我是黄海广。 今天我体验到了科大讯飞版本的ChatGPT&#xff0c;这个产品凭借其强大的功能和出色的性能&#xff0c;超出了我对国产大模型的预期。 一、产品简介 这个模型全名叫讯飞星火认知大模型&#xff0c;官方是这么解释这个产品的&#xff1a; “科大讯…

七大语言模型PK,ChatGPT内容基线测评稳居第一

随着ChatGPT的爆火与流行&#xff0c;大型语言模型&#xff08;LLM&#xff09;与生成式人工智能&#xff08;AIGC&#xff09;不断跃入大众视野&#xff0c;随之也带来了许多内容风险隐患。 近日&#xff0c;知道创宇内容安全专家对互联网上流行的7款大型语言模型进行了全面和…

ChatGPT风靡全球,我们应该为未来感到担心吗?

近期&#xff0c;关于ChatGPT的话题再次引爆全网&#xff0c;不少用户加入到“玩疯了”的阵营中……有赞叹不已的、有表示惊奇的、有展示BUG的&#xff0c;但总体来说&#xff0c;ChatGPT的整体社交评价还是非常向好的。 微软CEO纳德拉就坦言&#xff0c;ChatGPT服务的风靡&…

库克考虑卸任苹果CEO,谁会是下一任接班人?

作者 | Carol 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 十年前&#xff0c;8 月 24 日那天&#xff0c;史蒂夫乔布斯宣布辞去苹果 CEO 一职&#xff0c;正式任命蒂姆库克成为苹果的新掌门人。如今&#xff0c;恰逢库克上任苹果 CEO 十周年。在今年4月份&…