当前位置: 首页 > news >正文

提供给需要学习的同学,C#读取,写入1200控制西门子V90源代码,博途V13C#源代码VS3...

提供给需要学习的同学,C#读取,写入1200控制西门子V90源代码,博途V13C#源代码VS3013版本,可以自己编写多步导入后伺服电机根据编写程序自动运行

最近帮实验室刚入坑工控的师弟调V90伺服,翻出了当年用VS2013写的旧代码,那时候博途V13还是主流,电脑还跑不动新版本的VS,现在整理出来给大家避避坑,省得像我当年一样熬到两点才搞定。

首先得先把基础的通信组态弄好,不然你C#写得再花里胡哨也连不上PLC。咱用的是S7-1200+V90 PROFINET通信,步骤其实不复杂,但新手很容易在GSD文件这里翻车:

  1. 先去西门子官网搜「SINAMICS V90 PROFINET GSD」,下载对应你V90固件版本的安装包,导入博途V13的设备目录里,不然博途找不到V90这个设备。
  2. 新建博途项目,添加S7-1200 PLC,配置好PLC的IP地址,比如192.168.0.1。
  3. 双击PLC的PROFINET接口,添加新设备,找到刚导入的V90,给它分配个IP,比如192.168.0.2,然后组态PZD(就是PLC和伺服之间传的实时数据),选标准的2字节控制字+4字节转速设定,2字节状态字+4字节实际转速就行,博途会自动给你分配外设IO地址,比如%QW100开始是输出给伺服的控制字和转速,%IW100开始是伺服反馈的状态字和实际转速,这个地址一定要记好,后面C#代码里要用。

接下来是VS2013的环境搭建,咱用的是Sharp7这个库,轻量又好用,而且兼容VS2013和.NET 4.5,刚好适配当年的环境:

  1. 去Sharp7的官网下2.0版本的dll,别下最新版,不然VS2013认不出。
  2. 新建VS2013控制台应用项目,把Sharp7.dll添加到引用里,记得把dll的「复制到输出目录」改成「始终复制」,不然运行的时候会报错找不到文件。

先写个最基础的连接PLC的代码:

using S7; using System; namespace SiemensV90Control { class Program { static void Main(string[] args) { // 初始化S7客户端,参数依次是:PLCIP、机架号、槽号 // S7-1200机架号固定0,槽号我当年试了1才连上,不行就换2试试 S7Client client = new S7Client(); int connectStatus = client.ConnectTo("192.168.0.1", 0, 1); if (connectStatus != 0) { Console.WriteLine($"连不上PLC啊喂:{client.ErrorText(connectStatus)}"); return; } Console.WriteLine("PLC连接成功!"); } } }

这段代码里的ConnectTo三个参数,第一个是你PLC的IP,第二个机架号都是0,第三个槽号是坑点,我当年换了三次才试对,别直接抄别人的,不行就1和2来回试。

提供给需要学习的同学,C#读取,写入1200控制西门子V90源代码,博途V13C#源代码VS3013版本,可以自己编写多步导入后伺服电机根据编写程序自动运行

连上线之后就可以读写数据了,咱要给伺服发控制字和转速,还要读状态和实际转速,这里要注意:咱操作的是PLC的外设IO,不是DB块,所以别用DBWrite,要用WriteArea,当年我就是在这里卡了好久。

比如咱要往%QW100(控制字)和%QW102(转速设定)写数据,代码大概是这样:

// 控制字:0x047E是准备好伺服,0x047F是启动,具体看V90手册别硬抄 ushort controlWord = 0x047E; float setSpeed = 1000.0f; // 设定1000转每分钟 // 把控制字和转速转成字节数组 byte[] ctrlBytes = BitConverter.GetBytes(controlWord); byte[] speedBytes = BitConverter.GetBytes(setSpeed); // 合并成连续的字节,从%QW100开始,一共6个字节(2+4) byte[] sendData = new byte[6]; Array.Copy(ctrlBytes, 0, sendData, 0, 2); Array.Copy(speedBytes, 0, sendData, 2, 4); // 往PLC的外设输出区写数据,参数依次是:外设输出区、0、起始地址、长度、数据 int writeStatus = client.WriteArea(S7Consts.S7AreaPA, 0, 100, 6, sendData); if (writeStatus != 0) { Console.WriteLine($"写失败了:{client.ErrorText(writeStatus)}"); } else { Console.WriteLine($"已发送控制字:{controlWord:X4},设定转速:{setSpeed} rpm"); }

这里解释一下S7AreaPA是过程输出区,也就是PLC发给外设的信号,S7AreaPE是过程输入区,用来读伺服反馈的数据,比如读状态字和实际转速的话就用ReadArea

// 读外设输入区,从%IW100开始,6个字节(状态字2+实际转速4) byte[] recvData = new byte[6]; int readStatus = client.ReadArea(S7Consts.S7AreaPE, 0, 100, 6, recvData); if (readStatus != 0) { Console.WriteLine($"读失败了:{client.ErrorText(readStatus)}"); } else { ushort statusWord = BitConverter.ToUInt16(recvData, 0); float actualSpeed = BitConverter.ToSingle(recvData, 2); Console.WriteLine($"当前状态字:{statusWord:X4},实际转速:{actualSpeed:F2} rpm"); }

接下来就是你要的多步自动运行了,伺服不是直接发个启动命令就转的,得按状态机来走:先准备伺服,等伺服反馈使能成功,再启动,再设定转速。咱写个循环来实现:

bool isServoRunning = false; while (true) { // 先读状态字,看伺服当前的状态 byte[] statusBytes = new byte[2]; client.ReadArea(S7Consts.S7AreaPE, 0, 100, 2, statusBytes); ushort status = BitConverter.ToUInt16(statusBytes, 0); if (!isServoRunning) { // 第一步:发送准备命令 ushort prepareCtrl = 0x047E; byte[] prepareData = BitConverter.GetBytes(prepareCtrl); client.WriteArea(S7Consts.S7AreaPA, 0, 100, 2, prepareData); Console.WriteLine("正在准备伺服..."); // 等状态字的使能位(bit3)为1,也就是伺服准备好了 if ((status & 0x0008) != 0) { // 第二步:发送启动命令 ushort startCtrl = 0x047F; byte[] startData = BitConverter.GetBytes(startCtrl); client.WriteArea(S7Consts.S7AreaPA, 0, 100, 2, startData); // 第三步:发送设定转速 float speed = 1500.0f; byte[] speedData = BitConverter.GetBytes(speed); client.WriteArea(S7Consts.S7AreaPA, 0, 102, 4, speedData); isServoRunning = true; Console.WriteLine("伺服启动成功,开始运转啦!"); } } else { // 运行中每秒刷新一次实际转速 byte[] speedBytes = new byte[4]; client.ReadArea(S7Consts.S7AreaPE, 0, 104, 4, speedBytes); float actual = BitConverter.ToSingle(speedBytes, 0); Console.WriteLine($"当前实际转速:{actual:F2} rpm"); System.Threading.Thread.Sleep(1000); } }

这里要注意,状态字的位定义一定要看V90的手册,我这里用的bit3是使能位,不同固件版本可能有点不一样,别直接抄,不然会一直判断失败。

最后给大家提几个我当年踩过的坑:

  1. Sharp7的版本一定要选2.0,新版本用了C#6的语法,VS2013跑不起来;
  2. PLC的102端口一定要开放,防火墙别挡着,不然连不上;
  3. GSD文件版本要和V90的固件版本对应,不然博途组态不上;
  4. 槽号别直接抄,1和2都试试,我当年就是槽号错了连了半小时;
  5. 控制字和状态字别硬抄,一定要看V90的参数手册,每个版本的V90可能有点不一样。

要是运行的时候伺服不转,先去博途里在线诊断看V90的报警,比如F7400是电机过载,A07400是电源没接好,比瞎改代码有用多了。

http://www.jsqmd.com/news/530140/

相关文章:

  • Linux为什么要分区?
  • 博图中RTD/TC信号处理的常见问题与解决方案
  • Xenia Canary进阶指南:深度解析Xbox 360模拟器的专业配置与性能调优
  • 20254214乔若曦实验一《Python程序入门设计》
  • Zotero PDF Translate插件自动翻译失效问题系统解决方案
  • No.1091 三菱PLC和组态王组态变频器的恒压供水系统控制 我们主要的后发送的产品有
  • 西门子PLC S7-200在立体车库控制系统中的应用联系
  • 如何通过Thief-Book将IDE变成高效阅读空间:开发者碎片化时间利用指南
  • WrenAI实战指南:从环境适配到场景落地的非典型路径
  • Qwen3-Reranker效果展示:医疗问答场景中症状描述与病历文档匹配案例
  • 如何突破AI开发成本壁垒?开源社区的零成本方案
  • FinalShell最新版控制台背景DIY教程:无需VIP也能玩转个性化(附高清素材包)
  • 创作效率翻倍!用yz-bijini-cosplay快速生成同人图、角色设定参考
  • 6ES5470-7LC13西门子模拟量输出模块
  • 如何快速掌握AwesomeTTS:面向Anki用户的终极语音学习指南
  • 别再只盯着人脸识别了!聊聊STM32F103c8t6+K210方案在智能门禁中的其他可能性
  • 百度网盘下载加速完全指南:突破限制的技术原理与实战方案
  • 被低估的创意引擎:ComfyUI工作流自动化的隐藏价值挖掘
  • 【OpenClaw从入门到精通】第44篇:360“龙虾保”VS奇安信“安全伴侣”——企业级AI Agent防护方案实战对比与选型指南(2026实测版)
  • 华为交换机日常运维必知的10个display命令(附实用场景)
  • Arduino轻量级任务调度库:无OS下的周期性协程管理
  • 438. 找到字符串中所有字母异位词
  • 破局QQ音乐加密困境:QMCDecode重构数字音频自由流通之路
  • Java并发——线程间的通信
  • 车联网感知技术
  • 新能源车空调PTC加热器拆解:为什么你的电动车暖风来得快?
  • COMSOL磁铁磁感线分布与电感计算模型下的永磁铁电磁场分析
  • 《Windows 11 从入门到精通》读书笔记 3.4.3:时间和日期的调整——我用“看日历 + 自动/手动切换 + 立即同步”把时间校准到位
  • 老旧Mac图形性能优化终极指南:告别卡顿,重获流畅体验
  • 二中机房一败涂地(1.0)