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

C#控制西门子V90伺服驱动器:基于博途V13与VS2013的读写与多步程序自动运行源代码

提供给需要学习的同学,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/544347/

相关文章:

  • ZYNQ PS与PL协同启动全流程:从bit文件生成到QSPI Flash固化的实战指南
  • 讲讲深圳名雕装饰别墅装修来图定制服务,靠谱吗 - 工业品牌热点
  • 避坑指南:MyBatisX自动生成代码时你可能会遇到的5个配置问题
  • 无添加的婴儿益生菌品牌推荐:纯净配方,给宝宝更安全的呵护 - yangyuan-shunfeng
  • 别再手动同步了!利用STM32定时器主从模式与ITR触发,实现硬件级精准定时联动
  • 终极指南:OpCore Simplify如何让你零基础打造完美黑苹果系统
  • 探讨2026年江阴住宅装修机构,怎么收费才合理 - 工业品网
  • 实战应用:基于快马生成示例代码,快速上手mac版openclaw开发
  • Python多线程为何总卡在GIL?揭秘CPython 3.12+原生无锁协程与subinterpreter落地的3个硬核条件
  • 解码WiFi CSI突破性技术:从原理到落地的全链路实战指南
  • OpenClaw自动化测试:nanobot驱动Appium完成移动端兼容性检查
  • 2026阳光房新选择:口碑公司为您定制理想空间,阳光房生产厂家甄选实力品牌 - 品牌推荐师
  • MusePublic圣光艺苑惊艳案例:基于真实建筑数据生成文艺复兴城市图景
  • Python从入门到精通(第08章):列表、元组、集合与字典
  • 【仅限首批内测用户】Mojo-Python ABI兼容性矩阵表泄露:12种组合中仅3种真正稳定可用!
  • 课堂教学质量智能评分系统设计与实现
  • 万象熔炉 | Anything XL实操分享:自定义CSS美化Streamlit界面UI
  • 避免Java Stream重复消费:高效过滤Map的策略
  • OpenClaw技能市场:Qwen3.5-4B-Claude专用技能安装指南
  • 2026年开关品牌推荐:兼顾实用与美学的优质之选 - 品牌排行榜
  • 哪吒监控面板SSH安全防护指南
  • Python环境变量冲突避坑指南:解决Fatal Python error: init_sys_streams错误(conda+Pycharm版)
  • Windows系统下PySpark环境配置与实战入门指南
  • 别再手动烧录了!用Ymodem给STM32F405RGT6做IAP升级,CubeMX+SecureCRT保姆级教程
  • C++调用C#新姿势:手把手教你用UnmanagedCallersOnly和Native AOT在.NET 8下导出函数
  • Linux内核架构设计与核心子系统解析
  • 江浙沪皖赣移动厕所生产厂价格大揭秘,哪家源头厂家资质好 - mypinpai
  • Spring PetClinic技术选型与实战指南:从架构设计到云原生部署
  • AI辅助开发:让快马AI成为你的ventoy插件开发助手与创意顾问
  • 嵌入式开发必看:NAND Flash坏块管理的5个实战技巧(附代码示例)