作用是解决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 空