背景

  最近遇到客户需要直接用计算机对伺服驱动器进行控制,并且出于成本考虑不希望使用PLC来间接的控制伺服驱动器,同时出于日后和其它软件联通的考虑希望自定义一个软件来控制伺服驱动器。
  驱动器采用国产信捷的DS5B驱动器,这是一款带485总线接口的驱动器,支持Modbus通讯。于是,作者遍想到编写一套通过Modbus通讯来直接控制DS5B驱动器的程序。如此一来,一方面可以实现不增加PLC等控制器实现计算机直接控制驱动器;另一方面客户日后又可以对源码进行修改来实现与其它软件的联通。

客户需求分析

  计算机通过USB转485接头与驱动器进行485通讯,接头在计算机端看来是一个串口,所以控制软件首先应该有打开并配置串口的功能。
  作为伺服驱动器,需要有使能(电机激磁,受控状态)和非使能(电机无激磁,自由状态)两种状态。所以控制软件还应具备电机使能和去使能的功能。
  客户在使用电机的时候有两种控制方式——速度方式和位置方式。速度方式即用户设定一个速度并使得电机按照给定速度运;位置方式则是客户给定一个运行距离,电机运行给定的距离(属于增量方式定位)。速度方式与位置方式互斥,所以软件应当有模式切换功能,并且在对应的模式下激活对应的控制区域。
  客户还需要能够在界面上时时监控电机的转速与编码器位置,用以作为速度和位置准确的依据。

界面设计

  首先,根据上面的需求,设计的如下图的控制界面。

  该界面中,端口右侧为一个listbox,用以显示计算机上所有的可用串口。连接按钮用于对选定的串口进行连接。位置模式按钮用以将驱动器切换到位置模式,同时该按钮将激活位置控制区域并禁用速度控制区域。速度模式按钮用以将驱动器切换到速度模式,同时该按钮将激活速度控制区域并禁用位置控制区域。电机速度右侧的textbox用以显示电机的时时速度,电机位置右侧的textbox用以显示电机的编码器的反馈位置。使能按钮将使驱动器使能,同时会使位置模式按钮和速度模式按钮被禁用(因为驱动器在使能后不允许切换控制方式,只有在非使能状态才能进行模式切换)。去使能按钮将使驱动器进入非使能状态,同时位置模式按钮和速度模式按钮将变为可用状态。

功能设计

  要实现上述界面的控制功能需要对驱动器进行Modbus通讯进行控制,同时考虑为了日后客户自定义开发的简便性,定义一个xj_servo类。类中包含了串口的调用,Modbus寄存器写入和读取功能,以及在寄存器写入读取功能基础上封装的速度设定、位置设定、加减速设定、启动、使能、去使能等功能。
  由于需要使用串口进行通讯,所以首先该类的构造函数会构造一个串口(serialport)对象。类内提供了两个构造函数,一个单纯构造一个串口对象,另一个则在构造的同时对串口进行属性的初始化。

     public xj_servo(){sp = new SerialPort();}public xj_servo(string portname,int baudRate,StopBits stopBit,Parity parity,int dataBits){sp = new SerialPort();setPortName(portname);setBaudRate(baudRate);setStopBits(stopBit);setParity(parity);setDataBits(dataBits);}

  构造函数能的setPortName、setBaudRate、setStopBits、setParity、setDataBits分别用于初始化串口的串口号、波特率、停止位、较验模式、数据位。之所以没有直接对串口对象进行初始化而选择了通过进一步封装的函数来对串口进行初始化的目的是尽量避免软件的崩溃概率。下面是setPortName的函数定义,其它函数类似。

     public int setPortName(string portname){try{sp.PortName = portname;return 1;}catch (Exception e){errData = e.ToString();return 0;}}

  考虑到可能存在按钮激活的Modbus功能与位置速度监控的Modbus功能可能同时对串口的调用,为了防止总线传输错误,特在类内增加一个flag,用以标识传输状态。每一次进行Modbus发送时,发送函数会首先读取该flag状态,从而避免通讯阻塞。

public class xj_servo{SerialPort sp;private string errData;private int flag;//用于标记当前的传输状态

  下面是读取伺服寄存器值的函数(写入伺服寄存器值的函数与其相似),可见其运行时首先查看flag的状态,如果flag为0(即已经有其它传输在进行)则直接忽略本次的传输。而当该函数进行传输之前则会将flag置0,以阻止其它传输的进行。
  函数内的code数组为Modbus命令内容,由于本次使用的驱动器站号固定为1,所以code数组的第一个字节为0x01;由于是读取功能,所以第二个字节为0x03;第三、四字节为要读取的寄存器地址,由函数的形参传入;第五、六字节为读取的长度,本次设计功能中只需要1位,所以第五、六字节固定为0x00,0x01;第七、八位为CRC16循环冗余较验码,先用0x00占位,之后调用ModBusCRC16函数进行修改。
  codeR数组为总线返回值的存储数组,由于本次的功能返回值长度固定为七个字节,故直接将codeR声明为七个字节长度的数组。
  函数调用sp串口对象的write函数以将查询命令代码code发送出去,由于驱动器返回内容有一个时间延时。为了正确的接收数据,在sp.write后增加了一个2毫秒的延时,然后再通过sp.read读取驱动器返回的数据。
  本次由于返回的速度和位置监控数据只是显示在界面中,并不用于时时控制,所以对返回数据的错误不敏感,所以本次没有对返回的数据再次进行CRC较验。而是直接读取了返回数据的第四、五字节并处理得到最终数据。如果返回值用于一些对数据正确性很敏感的场合,例如反馈控制,则必须进行CRC校验验证读取数据的正确。
  为了防止因为单次的串口发送错误(工业现场干扰较多,极容易出现传输错误)导致整个程序崩溃,所以整个串口过程写在try{}内,以提高可靠性。

private int readServo(byte posH, byte posL){if (flag == 0){return -1;}try{flag = 0;byte[] code = new byte[] { 0x01, 0x03, posH, posL, 00, 01, 0x00, 0x00 };byte[] codeR = new byte[] { 0, 0, 0, 0, 0, 0, 0 };ModBusCRC16(ref code, 6);sp.Write(code, 0, 8);Thread.Sleep(2);sp.Read(codeR, 0, 7);int tmp = codeR[3] * 256 + codeR[4];return tmp;}catch (Exception e){errData = e.ToString();flag = 1;return -1;}}

  为了方便调用,在写入伺服寄存器的函数的基础上封装了速度设定、位置设定、加减速设定、使能等功能,例如下方的setServoSpeed、setServoAcc

     public int setServoSpeed(int speed){return setServo(speed,0x03,0x05);}public int setServoAcc(int ms){return setServo(ms, 0x03, 0x09);}

  在基础的类封装完毕后,界面程序便可以通过调用这些功能来实现预期的界面功能。下面以使能按钮为例:
  点击使能按钮后,首先将flag_g置0,以实现对速度、位置监控线程暂时停止监控(在软件运行后,会启动一个单独的线程以监控电机速度和位置值,该线程不断的周期调用总线以读取速度和位置值。假如我们按下使能按钮的时候该线程正好在使用总线,那么使能按钮中的相关总线功能将因为xj_servo中的flag=0而不执行。所以在GUI界面中,每一个按钮功能执行时会首先使flag_g=0以暂时停止监控功能,在只能完毕后再flag_g=1来恢复监控功能。如此一来就可以避免有时明明按了按钮功能却没有执行的情况)。然后会弹出驱动器即将运行的警告框。在警告框关闭后,将会使速度模式按钮和位置模式按钮不可用。在经过一个20毫秒的延时后(目的是保证flag_g=0后至少经过20ms才进行总线通信,防止阻塞),先通过setServoSpeed将驱动器速度设置为0(因为在速度模式下,驱动器使能后,电机会根据设定的速度值运转。如果在使能前不进行速度置零而内部速度命令寄存器的值又不为零,电机在使能的一刻就会开始运转,容易造成人员和设备危险),然后确认速度设定成功后,再将驱动器进行使能。使能后,将flag_g=1,使监控线程继续监控。

     private void button2_Click(object sender, EventArgs e){flag_g = 0;MessageBox.Show("即将使能驱动器,机械随时可能运动,请确保安全");button7.Enabled = false;button10.Enabled = false;Thread.Sleep(20);int tmp = xj.setServoSpeed(0);System.Diagnostics.Debug.WriteLine("设定0速度:" + tmp+"\n");if (tmp==1){            Thread.Sleep(5);xj.setServoEnable();System.Diagnostics.Debug.WriteLine("使能");}flag_g = 1;}

通过上述的方式,便可编写出伺服控制上位机软件,然后再更改驱动器内部的一些参数,如P0-01=3(内部速度控制) P5-28=0(采用预设速度1)等等,便可实现驱动器接受软件的控制。

控制程序源码下载

信捷DS5B伺服驱动器Modbus控制程序编写相关推荐

  1. 六轴机械手程序 用信捷XD5和威纶触摸屏编写

    六轴机械手程序 用信捷XD5和威纶触摸屏编写. 此程序已经实际设备上批量应用,程序成熟可靠,借鉴价值高,程序有注释. YID:6643645620226313工控数码编程

  2. 信捷plc使用modbus RTU和变频器通讯

    信捷plc使用modbus rtu和信捷变频器通讯 0.1:要求:plc和变频器都支持modbusRTU的 1:modbus和rs485的区别 modbus是一种串行通讯协议,而rs485是硬件接口, ...

  3. 三菱fx2n做从站的modbus通讯_信捷PLC做MODBUS远程从站的方法

    一.PLC准备: PLC连接电源(注意电源是24VDC还是220VAC),将编程电缆插上PLC的COM1口,另一端连电脑的COM口(或是USB-232线),PLC的485串口(COM2口A/B端子)连 ...

  4. 信捷plc和台达变频器通信程序通过信捷xc3的modbus通信控制台达vfd-m变频器的正转,反转,加减速,停止

    信捷plc和台达变频器通信程序通过信捷xc3的modbus通信控制台达vfd-m变频器的正转,反转,加减速,停止. 同时可以威纶触摸屏监控变频器的运转频率,电压,电流,资料详细,包括参数的设置和plc ...

  5. 信捷plc和台达变频器通信程序通过信捷xc3的modbus通信控制台达vfd-m变频器的正转

    信捷plc和台达变频器通信程序通过信捷xc3的modbus通信控制台达vfd-m变频器的正转,反转,加减速,停止 同时可以威纶触摸屏监控变频器的运转频率,电压,电流,资料详细,包括参数的设置和plc的 ...

  6. 信捷plc和台达变频器通信程序 通过信捷xc3的modbus通信控制台达vfd-m变频器的正转,反转,加减速,停止

    信捷plc和台达变频器通信程序 通过信捷xc3的modbus通信控制台达vfd-m变频器的正转,反转,加减速,停止. 同时可以威纶触摸屏监控变频器的运转频率,电压,电流,资料详细,包括参数的设置和pl ...

  7. 六轴机械手程序 用信捷XD5和威纶触摸屏编写。

    六轴机械手程序 用信捷XD5和威纶触摸屏编写. 此程序已经实际设备上批量应用,程序成熟可靠,借鉴价值高,程序有注释. 此款为宏指令有加密拿走请看清 ID:6919655884909740

  8. 机械手程序,六轴程序用信捷XD5和威纶触摸屏编写

    机械手程序,六轴程序用信捷XD5和威纶触摸屏编写. 此程序已经实际设备上批量应用,程序成熟可靠,借鉴价值高,程序有注释. YID:138662483310125

  9. 信捷PLC-C语言FB内编写轴控指令的方法举例-使能、速度控制、停止指令篇

    前言-受本人水平所限,所写内容仅为本人测试过的代码以及观点,错漏之处请不吝指正. 首先在定义区内定义我们需要的函数参数,本篇省略内部FB参数引出方式等,主要介绍基本方法. VAR_IN_OUT Axi ...

最新文章

  1. 二、StreamAPI
  2. python中新式类和经典类
  3. DICOM的常用Tag分类和说明
  4. 青岛计算机类职业中学,青岛最好的职业学校有哪些?
  5. Leetcode--135. 发糖果
  6. oracle如何设置权限,ORACLE的权限设置
  7. [转]“Ceph浅析”系列之(—)—Ceph概况
  8. iOS内存泄漏的常见情况
  9. 2021辽宁高考成绩查询公布,2021辽宁高考成绩什么时候出
  10. mojang官方正版服务器,《我的世界》如果Mojang上线最新版本,你最想要的是哪种版本更新...
  11. 数字后端基础技能之:CTS(下篇)
  12. 最新手机号段归属地数据库 高性能dat解析
  13. Jmeter的面试题集
  14. iPhone XS Max A2101(D3XP X1048 MLB P1 D33P) 820-01225 苹果手机点位图
  15. ROS路由器做PCQ限速教程
  16. 【杭电5053】the Sum of Cube
  17. 基于小波Block-Thresholding的降噪方法
  18. IEEE年度薪酬报告发布!美国程序员薪资中位数7年来首次下降2.4万
  19. 计算机怎么看ping,如何查看自己电脑的PING
  20. mysql转储导入错误_将MySQL转储应用于RDS时出现“无法解析表名”错误

热门文章

  1. 【keepass】密码管理软件-推荐插件和相关工具合集-keepass工作流分析(自动填充、美化界面、快速添加记录、安全增强、软件和数据库维护类)
  2. 天空盒的制作方法 Max来生成天空盒的六张图片
  3. Word2vec学习
  4. 人在四合院:我变成了何雨柱(三)
  5. 计算机网络协议分为哪几层?7层协议、5层协议、4层协议。
  6. 什么是半波整流器?半波整流器的使用方法
  7. 计算机提示没有有效的ip配置,Win7本地连接没有有效的ip配置怎么办?
  8. vb读取文本文件某行的内容
  9. 计算机存储容量单位的倍数关系,存储器容量单位有哪些,它们之间的关系是什么...
  10. 计算机教室100字介绍,班级简介范文100字