资讯详情

台达B3伺服C#类库

作用是解决C#控制伺服问题

1使用初始化初始化伺服:

Help_Delta_B3 b3 = new Help_Delta_B();//台达伺服;B3系列//========================================            b3.B3_init_初始化(0x7f);            b3.Gcode_init_G代码初始化();

2 初始化好了之后,就可以用了

  private void button6_Click(object sender,EventArgs e)                                                                                                                                                                                                                                                                                                                                                                                                             b3.Gcode_解析(textBox1.Text,true);          private void button7_Click(object sender,EventArgs e)                                                                                                                                                                                                                                                                                                                                                                                                             b3.Gcode_解析(textBox2.Text,true);      

总共就这两步。textBox1.Text里填标准G代码。

//"G0X9.896Y10.158Z1.000F10000"

下面是源码

using System;using System.Collections.Generic;using System.IO.Ports;using System.Threading;using System.Threading.Tasks;namespace help{    // <summary>    /// Help_Delta_B3 b3 = new Help_Delta_B()/台达伺服 B3驱动器    /// 每帧数据,结尾必须留10ms    /// 应答报文留10ms等待。“P3.007”ms   0.5ms    /// 伺服每帧应答最快能保证小于10ms    /// 出厂38400n82    /// 编码器24bit  16777216    ///     /// </summary>    public class Help_Delta_B3   B3系列  RS通信485通信                          #region   Help_ModBus rs485 = null;//数据帧业务        #endregion        #region 属性                                                                                                                           public Help_ModBus help_ModBus { get => rs485; set => rs485 = value;      public Int32 DI { get => get_DI(); set => set_DI(value);         public Int32 DO_状态 { get => get_DO();         #endregion        #region 构造        /// <summary>     B3,</summary>        public Help_Delta_B3()                      rs485 = new Help_ModBus();//数据帧业务         rs485.delay_帧头等待 = 10ms            rs485.delay_帧尾等待 = 10ms          #endregion        #region    自定义方法       ==========================================================================        #region          #region  get     <summary>     获取寄存器的值     </summary>     <param name="str"></param>     <returns></returns>        Int32 get_value(string data)     "44秒294ms: 7F       55       DC"            string str = data;            if (str?.Length > 0)                           int i = 0;              string at = rs485.address.ToString("X2")   "03";  F3033                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    i = str.IndexOf(at);                if (i < 14 && str.Length > 23)//在帧的开头,                           str = str.Substring(i  4); /字节数  字节              if (str.Substring(0,2) == "04")               " 2秒428ms:7F03    04 966B0  00CB       09CC"                        string num0 = str.Substring(2,4);//是0                              string num1 = str.Substring(6,4);//是1                                        return Convert.ToInt32(num1   num0,16);                                                                                          return try              string data = string.Empty;         data = b3.get_电机位置();         if (data?.IndexOf("0304") > 1)         {             string data1 = data.Substring(data.IndexOf("0304")   4,8);           string data2 = data1.Substring(0,4);          string data3 = data1.Substring(4,4);            string data4 = data3   data2.            //    Int32 z_坐标 = Convert.ToInt32(data4、16);         textBox4.Text = z_坐标.ToString();                                            ////      catch (Exception ex)              System.Windows.MessageBox.Show(ex.Message);        throw;                        <summary>        "P4.007"     </summary>     <returns></returns>        public Int32 get_DI()      {/注意:这里不要用Task            int num = 0;          string str = read_reg16bit("P4.007");            num = get_value(str);            return num;        }     <summary>     读取DO输出     "P4.009"     </summary>     <returns></returns>        public Int32 get_DO()     b            string str = null;            int num = 0;          str = read_reg16bit("P4.009");            num = get_value(str);            return num;         <summary>     DO       </summary>     <returns></returns>      public string set_DO()      { // 输出极性 "P2.018"          string str = read_reg16bit("P4.006");          return str;      }        public Int32 get_面板输入()                                                            int num = 0;          string str = read_reg16bit("P4.008");            num = get_value(str);            return num;          public int get_软件版()                                                                        int num =      string str = read_reg32bit("P0.000");            num = get_value(str);            //"35秒728ms:7F0304279300009EAD"            //27930000            return num;        }        /// <summary>        /// 获取故障码        /// "P0.001"        /// </summary>        /// <param name="data"></param>        /// <returns></returns>        public int get_故障()        {//报警:故障码            int num = 0;            string str = read_reg32bit("P0.001");            num = get_value(str);            return num;        }        /// <summary>        /// 故障记录        /// "P4.000""P4.001""P4.002"P4.003""P4.004"        /// </summary>        /// <returns></returns>        public string get_故障记录()        {//13  0f21   0235  30  09            string[] str = new string[5];            str[0] = read_reg32bit("P4.000");//            string num0 = "第1故障:" + get_value(str[0]).ToString("X8");            str[1] = read_reg32bit("P4.001");//            string num1 = "第2故障:" + get_value(str[1]).ToString("X8");            str[2] = read_reg32bit("P4.002");//            string num2 = "第3故障:" + get_value(str[2]).ToString("X8");            str[3] = read_reg32bit("P4.003");//            string num3 = "第4故障:" + get_value(str[3]).ToString("X8");            str[4] = read_reg32bit("P4.004");//            string num4 = "第5故障:" + get_value(str[4]).ToString("X8");            return num0 + num1 + num2 + num3 + num4;            //return str.ToString();        }        /// <summary>        /// 伺服启动时间"P0.008"        /// </summary>        /// <returns></returns>        public int get_伺服启动时间()        {//报警:故障码            int num = 0;            string str = read_reg32bit("P0.008");            num = get_value(str);            return num;        }        /// <summary>        /// 获取电机位置        /// "P5.016"        /// </summary>        /// <returns></returns>        public int  get_电机位置()        {//32bit            //P5.016            int  num = 0;            //编码器位置   3秒397ms:7F03  04  96B0 00CB   09CC"            string str = read_reg32bit("P5.016");//轴位置-电机编码器            num = get_value(str);            return num;        }        public void get_CH1()        {//P0.003控制最大0x77   bit0是CH2功能设置         //p1.003         //p1.004         //p1.005         //P1.101         //P4.020偏移CH1校正mV         //模拟速度输入P4.022        }        public void get_CH2()        {//P0.003控制最大0x77   bit0是CH2功能设置         //P1.102         //P4.021偏移CH2校正mV         //模拟扭矩输入P4.023        }        #endregion        #region  set        /// <summary>        /// 设置通讯从站(编号)        /// </summary>        /// <param name="add">默认0x7F</param>        public void set_address(byte add)        {            help_ModBus.address = add;// 设置站号        }        //====通信参数:287页========================================        //手动输入P2.008=0010 重新上电恢复出厂设置(出厂为 站号7F,波特率38400,n82 )        //P3. 000   =    0x007F    站号127           //P3. 001   =    0x0203    DCBA:A:(RS485波特率(0:4800,1:9600,2:19200,3:38400,4:57600,5:115200)        //                            //C: can(0:125Kbps,1:250Kbps,2:500kps,3:750Kbps,4:1Mbps)        //                            //D:0使用非轴卡,3使用台达轴卡DMCNET        //P3. 002   =    0x0006    DCBA:A:(6:8N2  (RTU8位无校验2停止)        //                                //(7:8E1  (RTU8位E偶校验1停止)        //                                //(8:8O1  (RTU数据位8,奇检验odd,停止位1)        //P3. 003   =    0x0000    DCBA:A:(0:警告并继续运转)        //                                //(1:通信故障处理:警告并减速(P5.003)        //P3. 004   =    0x0000    DCBA:A:(通讯逾时报警sec秒:1秒(调试用0)看门狗 0~20秒        //P3. 006   =    0x0000    DI开关来源(0:外部端子 1:内部P4.007控制),Bit 0 ~Bit 7 对应至 DI1 ~DI8(P2.010~P2.017)        //                                                                                     DI9 ~DI3(P2.036~P2.040)        //                                                                    P2.010后2位是开关的功能第3位是控制接常开还是常闭        //P4. 007   =      00E0     bit对应软开关DI   0x0011(表示sdi5和sdi1为ON,软开关总共0x1fff)控制输入13个开关        //P3. 007   =    0x0000    通讯延时回复  0~1000ms  +  0.5ms单位        /// <summary>        /// 初始化:基础通讯        /// 网口:4负(B)  5正(A)        /// </summary>        public void set_init_通讯初始化()//B3伺服:初始化寄存器  //这功能需要手动配置  // 通讯部分        {            //不要再建Task            string str;            //伺服P2.008=0x0010恢复出厂:从站0x7f,波特率38400,RTU模式,8数据,无校验,2停止位            //再改站号            //rs485.address = 0x7f;            //set_reg("P3.000", 0x0001);//站号       站号01            //set_reg("P3.001", 0x0201);//波特率     203:(can500k 串口38400)  201(can500k串口9600)            //set_reg("P3.002", 0x0008);//校验       6(8N2) 7(8E1) 8(8O1)            str = set_reg16bit("P3.003", 0x0001);//通讯故障处理     警告并减速            str = set_reg16bit("P3.004", 0x0000);//看门狗 0~20秒     通讯断开时报警  单位:秒                                                 //str = set_reg16bit("P3.005", 0x0000);//伺服保留            str = set_reg16bit("P3.006", 0x01FFF);//输入开关源     DI输入端子选择,0:外部端子  1:内部寄存器控制   P4.007决定,Bit 0 ~Bit 7 对应至 DI1 ~DI8(P2.010~P2.017)            str = set_reg16bit("P3.007", 0x0000);// 1.5ms后应答         //  应答时间,通讯回复延迟时间  单位:0.5ms        }        /// <summary>        /// 纯PT模式        /// </summary>        public void set_init_基础参数()        {            #region 说明            //P1.001● 控制模式及控制命令输入源设定            //P1.002▲ 速度及扭矩限制设定            //P1.003 检出器脉冲输出极性设定            //P1.012 ~            //P1.014 内部扭矩指令 / 内部扭矩限制 1 ~3            //            //P1.044▲ 电子齿轮比分子 (N1)            //P1.045▲ 电子齿轮比分母 (M)            //P1.046▲ 检出器输出脉冲数设定            //P1.055 最大速度限制            //P1.097▲ 检出器输出(OA, OB)分母            //P5.003 自动保护的减速时间            //            //P5.020 ~            //P5.035 加 / 减速时间(编号#0 ~ 15)            //            //P5.016■ 轴位置-电机编码器            //P5.018 轴位置-脉冲命令            //            //P1.000▲ 外部脉冲列输入型式设定            //P2.060 电子齿轮比分子(N2)            //P2.061 电子齿轮比分子(N3)            //P2.062 电子齿轮比分子(N4)            //P5.008 软件极限:正向            //P5.009 软件极限:反向            //P6.002 ~            //P7.099 内部位置指令#1 ~ 99            //P5.060 ~            //P5.075            //内部位置指令控制#0 ~ 15 的移动速            //度设定            //P5.004 原点复归模式            //P5.005 第一段高速原点复归速度设定            //P5.006 第二段低速原点复归速度设定            //P5.007■ PR 命令触发缓存器            //P5.040 ~            //            P5.055            //位置到达之后的 Delay 时间(编号            //#0 ~ 15)            //P5.098 事件上缘触发 PR 程序编号            //P5.099 事件下缘触发 PR 程序编号            //P5.015■PATH#1 ~ PATH#2 数据断电不记忆设定            //P1.001● 控制模式及控制命令输入源设定            //P1.002▲ 速度及扭矩限制设定            //P1.003 检出器脉冲输出极性设定            //P1.046▲ 检出器输出脉冲数设定            #endregion            string str, str1, str2;            #region  重要参数            //===========================================================================================================            str1 = set_reg16bit("P1.055", 3000);//最大转速限制            str2 = set_reg16bit("P1.056", 20);//预过载百分比0~120            /* 这参数很重要,低于导轨最大受力值  */            set_motor_防撞保护(30, 10);//防撞百分比 0~300力矩, 防撞时间过滤1~1000ms  (P1.057,P1.058)            /* 这参数很重要,低于导轨最大受力值  */            set_PR_ZERO_机械回零(5, 2000, false);//回零力矩,确认时间20转2秒                                             //===伺服显示屏==============================================================================================            str1 = set_reg16bit("P0.002", (UInt16)LEDshow.L54电机目前实际扭力);//伺服显示屏:39 DI                                                                       //============================================================================================================            #endregion            str = set_reg16bit("P1.000", 0x1002);//脉冲+符号,            str1 = set_reg16bit("P1.001", (ushort)mode工作模式.PT | 0x100 | 0x0000);//PR+T混合模式 +  电机方向  +  DIO            str2 = set_reg16bit("P1.002", 0x0000);//D1力矩 D0速度   限制(必须关闭)//力矩值选择P1.012,13,14            str = set_reg16bit("P1.003", 0x0000);//监视输出。0: MON1(+), MON2(+)            str1 = set_reg16bit("P0.003", 0x0010);//MON2 速度  MON1 力矩            str2 = set_reg16bit("P1.004", 100);//MON1 模拟监控输出比例            str = set_reg16bit("P1.005", 100);//MON2 模拟监控输出比例            str1 = set_reg16bit("P1.022", 0x0000);//  PR 命令滤波器   禁止反转:0关闭            str2 = set_reg16bit("P1.032", 0x0060);//动态刹车再空转       p1.38 零速   AL22主电源异常            str = set_reg16bit("P1.038", 10);//参数定义零速信号条件  默认10转            str1 = set_reg16bit("P1.039", 1000);//目标速度:转速到达信号条件DO输出脚(TSPD)                                                //set_reg("P1.041", 50);//CH模拟量输入扭矩比例  默认100            str2 = set_reg16bit("P1.042", 500);//伺服使能后电磁刹车释放延时ms            str = set_reg16bit("P1.043", 500);//脱机后刹车抱闸延时ms                                              //===============================================                                              //set_reg("P1.044", 16777216);//分子1677 7216                                              //set_reg("P1.045", 3600);//分母  10个脉冲1度                                              //===============================================                                              //set_reg32bit("P1.054", 167772);//位置确认范围  0.1度            //set_reg("P1.064", 0);//模拟量输入控制电机旋转角度  PT   0关            //set_reg("P1.066", 0);//模拟位置+10v圈数DEC 0~2000(200圈)            //set_reg("P1.074", 0);//编码器ABZ位置输出源            //set_reg("P1.012", 100);//单边扭力限制 -500~500   P1.012~P1.014            //set_reg("P1.014", 100);//单边扭力限制 -500~500   P1.012~P1.014            str = set_reg16bit("P1.098", 100);//断线侦测保护(UVW)反应时间 ms 0~800ms                                              //set_reg("P2.050", 1);//脉冲清除                                              //set_reg("P2.052", 1073.741824);//分度总行程        }        /// <summary>        /// 纯外部端子脉冲输入        /// 要重启        /// </summary>        public void set_PT工作模式()        {//要重启            string str1 = set_reg16bit("P1.001", (ushort)mode工作模式.PT | 0x000 | 0x0000);//PR+T混合模式 +  电机方向  +  DIO            string str2 = set_reg16bit("P1.002", 0x0000);//D1力矩 D0速度   限制(必须关闭)//力矩值选择P1.012,13,14        }        /// <summary>        /// 总线定位        /// 要重启        /// </summary>        public string set_PR工作模式()        {            string str1 = String.Empty, str2;            str1 = set_reg16bit("P1.001", (ushort)mode工作模式.PR | 0x000 | 0x0000);//PR+T混合模式 +  电机方向  +  DIO            str2 = set_reg16bit("P1.002", 0x0000);//D1力矩 D0速度   限制(必须关闭)//力矩值选择P1.012,13,14            return str1;        }        /// <summary>        /// 总线定位+力矩        /// 要重启        /// </summary>        /// <param name="data">力矩</param>        public string set_PRt工作模式(UInt16 t1,UInt16 t2,UInt16 t3)         {            string str1 = String.Empty, str2;            str1 = set_reg16bit("P1.001", (ushort)mode工作模式.PR_T | 0x100 | 0x0000);//PR+T混合模式 +  电机方向  +  DIO                                                                                  //开启 力矩            str2 = set_reg16bit("P1.002", 0x0010);//D1力矩 D0速度   限制(必须关闭)//力矩值选择P1.012,13,14                                                  //力矩 1            str2 = set_reg16bit("P1.012", t1);// 1号:力矩百分比                                                //力矩 2            str2 = set_reg16bit("P1.013", t2);//T2            //力矩 3            str2 = set_reg16bit("P1.014", t3);//T3            return str1;        }        /// <summary>        /// 设置DI  "P4.007"        /// </summary>        /// <param name="start"></param>        /// <returns></returns>        public int set_DI(Int32 start)        {//注意:不能用Task   (上一级已经用了task了)            //P4.007  bit对应开关状态             // 说明书3.3.2节  +0x100 常开            // DI 1  P2.010     01  SON     伺服启动            // DI 2  P2.011     08  CTRG     内部位置命令触发    呼叫PR#            // DI 3  P2.012     11  POS—0   内部位置命令选择 0  PR#码段            // DI 4  P2.013     12  POS—1               // DI 5  P2.014     16  TCM—0   力矩码段(索引)            // DI 6  P2.015     17  TCM—1            // DI 7  P2.016     20  T-P     扭矩/位置混和模式命令---选择切换   高电平:P 定位带力矩模式    低电平:纯力矩模式(正反都使能是:阻力模式)            // DI 8  P2.017     21  EMGS    紧急停止            // DI 9  P2.036     02  ARST    异常重置            // DI 10  P2.037    37      正点动            // DI 11  P2.038    38      负点动            // DI 12  P2.039    46      停车钮            // DI 13  P2.040    100  关    常开                  int str = get_value(set_reg16bit("P4.007", start));//0x1fff   bit 12~0   对应输入开关 Di 13~0            return str;        }        /// <summary>        /// 模拟输出监控 P0.003        /// 0 电机速度        /// 1 电机扭矩        /// 2 脉冲命令频率        /// 3 速度命令        /// 4 扭矩命令        /// 5 VBUS 电压        /// 6 P1.101 的设定值        /// 7 P1.102 的设定值        /// </summary>        /// <param name="MON1">0~7</param>        /// <param name="MON2">0~7</param>        /// <returns></returns>        public string set_模拟输出监控(Int32 MON1, Int32 MON2)        {//模拟输出监控            string str = read_reg32bit("P0.003");            return str;        }        /// <summary>        /// 驱动器显示//ushort num = (ushort)(LEDshow)Enum.Parse(typeof(LEDshow), comboBox1.Text);        /// </summary>        /// <param name="led"></param>        public void set_LED显示(LEDshow led)        {            try            {                //ushort num = (ushort)(LEDshow)Enum.Parse(typeof(LEDshow), comboBox1.Text);                ushort num = (ushort)led;                set_reg16bit("P0.002", num);            }            //catch (Exception ex) { MessageBox.Show(ex.Message); }            catch (Exception ex) { System.Windows.MessageBox.Show(ex.Message); }//显示错误        }        public int set_JOG点动速度(UInt16 speed)        {            string str = set_reg16bit("P4.005", speed);//点动速度            int end = get_value(str);            return end;        }        /// <summary>        /// "P5.008"        /// </summary>        /// <param name="data"></param>        /// <returns></returns>        public int set_正软限位(Int32 data)        {            int end = 0;            string str = set_reg32bit("P5.008", data);            end = get_value(str);            return end;        }        /// <summary>        /// "P5.009"        /// </summary>        /// <param name="data"></param>        /// <returns></returns>        public int set_负软限位(Int32 data)        {            int end = 0;            string str = set_reg32bit("P5.009", data);            end = get_value(str);            return end;        }        /// <summary>        /// 电子齿轮比        /// "P1.044"分子        /// </summary>        /// <param name="a_分子"></param>        /// <param name="b_分母"></param>        public int[] set_电子齿轮比(int a_分子, int b_分母,double d_导程,double  f_负限位,double  z_正限位)        {            int[] clb = new int[2];            clb[0] = get_value(set_reg32bit("P1.044", a_分子));//16777216 //这个固定,编码器一圈脉冲            clb[1] = get_value(set_reg32bit("P1.045", b_分母));// 360 //360表示一圈脉冲                                                             //默认一圈 十万脉冲。                                                                        set_负软限位((int)( f_负限位/d_导程 * 16777216));            set_正软限位((int)(z_正限位/d_导程* 16777216));            return clb;        }        /// <summary>        /// 精度:位置确认范围"P1.054",误差报警值"P2.035"        /// 默认167772        /// 167772/16777216    //24bit        /// // 正负 1%度        /// </summary>        /// <param name="num">电机一圈16777216</param>        public int set_精度(Int32 num)        {//十进制32bit         //误差报警阀值"P2.035" //默认50331648         //编码器1677721600(360 /  0.33份)            int numend = 0;            numend = get_value(set_reg32bit("P1.054", num));//位置确认范围            return numend;        }        public int set_最大速度(UInt16 speed)        {            int sd = 0;            sd = get_value(set_reg16bit("P1.055", speed));//最大速度            return sd;        }        public int set_过负载警告(UInt16 n120)        {            int re = 0;            re = get_value(set_reg16bit("P1.056", n120));//最大速度            return re;        }        /// <summary>        /// 力矩报警阀值        /// P1.057防撞百分比 0~300         /// P1.058时间1~1000ms        /// </summary>        /// <param name="max">0~300%</param>        /// <param name="time_ms">1~1000ms</param>        public void set_motor_防撞保护(ushort max, ushort time_ms)//力矩报警阀值 , ms        {            //要小于导轨承受值            string str;            str = set_reg16bit("P1.057", max);//50 防撞百分比 0~300   P0.002=54电机实时扭力            str = set_reg16bit("P1.058", time_ms);//10 防撞时间过滤1~1000ms     2个值都超过时AL30        }        /// <summary>        /// 内部扭矩限制 1        /// "P1.002"=0x0010        /// "P1.012"        /// </summary>        /// <param name="mun"></param>        public int set_限制力矩(ushort lj)        {            int re = 0;            //set_reg("P1.002", 0x0000);//关闭扭矩限制(必须关闭)//力矩值P1.012,13,14            // UZYX   x:限速   y:限力    0关1开            //速度 P1.009  , P1.010  ,P1.011            //力矩 P1.012  , P1.013  ,P1.014            string str = set_reg16bit("P1.002", 0x0010);//限力限速模式//力矩值P1.012,13,14            re = get_value(set_reg16bit("P1.012", lj));//力矩1号  //需要TCM0            return re;        }        /// <summary>        /// 回零力矩P1.87,确认延时P1.88(2~2000ms)        /// v1.02版本 基础值是10+设定值        /// </summary>        /// <param name="data">力矩</param>        /// <param name="time_ms">时间,小于2000ms</param>        public void set_motor_回零力矩(int data, int time_ms)// "P1.087"  //力矩报警阀值  扭力回零准位 1~300%  /扭力计时 2~2000ms        {//v1.02版本是( 值+10 )            /* 这参数很重要,低于导轨最大受力值  */            //if (data > 20)            //{            //    data = 20;            //}            string str = set_reg16bit("P1.087", data);//扭力回零准位 1~300%            if (time_ms < 2)            {                time_ms = 2;            }            if (time_ms > 2000)            {                time_ms = 2000;            }            str = set_reg16bit("P1.088", time_ms);//扭力计时 2~2000ms        }        /// <summary>        /// 机械回零        /// 呼叫执行 PR# 0 回原点 P5.007=0;        /// </summary>        /// <param name="data">回零力矩</param>        /// <param name="time_ms">确认时间,小于2000ms</param>        /// <param name="run">立即执行bool</param>        public void set_PR_ZERO_机械回零(ushort data, ushort time_ms, bool run)//回零力矩,确认时间ms,立即回零        {//机械回零操作            string str;            /* 这参数很重要,低于导轨最大受力值  */            set_motor_回零力矩(data, time_ms);//"P1.087"力矩报警阀值  扭力回零准位 1~300%  /扭力计时 2~2000ms            //set_motor_防撞保护(50, 10);//防撞百分比 0~300, 防撞时间过滤1~1000ms            str = set_reg16bit("P5.004", 0x010A);//机械回零模式:超程反转,            str = set_reg32bit("P5.005", 400);//回零第一次高速复归速度设定  400转            str = set_reg32bit("P5.006", 100); //回零第二次低速复归速度设定   100转                                               //PR# 0  功能定义                                               //D7  0   上电时:0停止 1立即机械回零                                               //D6  0   空                                    

标签: 电机刹车电容

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台