信捷DS5B伺服驱动器Modbus控制程序编写

背景

  最近遇到客户需要直接用计算机对伺服驱动器进行控制,并且出于成本考虑不希望使用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)等等,便可实现驱动器接受软件的控制。

控制程序源码下载

现场测试

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
信捷DS2系列伺服驱动器说明书是一本详细介绍该系列产品的手册。这个系列是信捷公司为满足不同应用需求而开发的一款伺服驱动器产品。说明书中包含了该系列产品的基本信息、技术参数、性能特点、安装方法、操作流程、故障排除等重要内容。 首先,信捷DS2系列伺服驱动器的基本信息包括产品型号、外观结构、机械尺寸和工作环境要求等。这些信息有助于用户了解产品的整体形态和适用条件,为安装和使用提供基础参考。 其次,说明书详细介绍了DS2系列伺服驱动器的技术参数和性能特点。包括电源电压、额定转矩、输出功率、控制方式、通信接口等关键参数,以及定位精度、响应速度、运动平滑性等性能特点。这些参数和特点的详细说明使用户能够更好地了解产品,并选择适合自己应用的型号。 在安装方法方面,说明书提供了具体的步骤和注意事项,包括电源和信号线连接、安装位置和固定方法、冷却要求等。这将帮助用户正确地安装和调试伺服驱动器,保证其正常运行。 此外,说明书还详细介绍了DS2系列伺服驱动器的操作流程和参数调整方法,包括运动控制命令、运动模式切换、参数设置和调整等。这些操作说明将有助于用户正确地使用驱动器,并根据实际需要进行相应的调整和优化。 最后,说明书还列举了一些常见故障及其排除方法,帮助用户在遇到问题时能够快速定位和解决。这些故障排除方法涵盖了硬件故障和软件故障的常见情况,为用户提供了重要的参考依据。 总之,信捷DS2系列伺服驱动器说明书通过详细的介绍和说明,为用户提供了全面的产品信息和操作指南,帮助用户正确地安装、使用和维护该系列产品,实现更高效、稳定的伺服驱动控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

soar3033

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值