锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

台达B3伺服C#类库

时间:2023-01-04 12:30:01 rpm电容x2什么电容器2c305电容器g628电机电容器电机驱动板滤波电容sd电容器

作用是解决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 {     ///      ///  Help_Delta_B3 b3 = new Help_Delta_B();//台达伺服; B3驱动器     ///  每帧数据,结尾必须留10ms     ///  应答报文留10ms等待。“P3.007”ms   0.5ms     ///  伺服每帧响应最快保证小于10ms     ///  出厂38400n82     ///  编码器24bit  16777216     ///       ///      public class Help_Delta_B3     {//台达伺服B3系列  RS485 通讯          #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 构造         ///          /// 台达伺服B3,默认构造         ///          public Help_Delta_B3()         {             rs485 = new Help_ModBus();//数据帧业务;             //rs485.delay_帧头等待 = 10;//必须10ms             rs485.delay_帧尾等待 = 10;//必须10ms         }          #endregion          #region 自定义方法         //==========================================================================         #region 基础功能          #region  get         ///          /// 获取寄存器的值         ///          ///          ///          Int32 get_value(string data)         {// "44秒294ms: 7F  03  04   0080  0000        65DC"             string str = data;             if (str?.Length > 0)             {                 int i = 0;                 string at = rs485.address.ToString("X2")   "03";  // 地址 功能码    7F03                 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  96B0  00CB       09CC"                         string num0 = str.Substring(2, 4);//是0                         string num1 = str.Substring(6, 4);//是1                         return Convert.ToInt32(num1   num0, 16);                     }                 }             }             return 0;             //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;             //}         }         ///          /// 读取外部输入         /// "P4.007"         ///          ///          public Int32 get_DI()         注意:这里不要用Task             int num = 0;             string str = read_reg16bit("P4.007");             num = get_value(str);             return num;         }         ///          /// 读取DO输出         /// "P4.009"         ///          ///          public Int32 get_DO()         {//001b             string str = null;             int num = 0;              str = read_reg16bit("P4.009");             num = get_value(str);               return num;         }         /          / 强制DO输出         /          /          //public string set_DO()         //{ // 输出极性 "P2.018"         //    string str = read_reg16bit("P4.006");         //    return str;         //}         public Int32 get_面板输入()         {             int num = 0;              string str = read_reg1bit("P4.008");
            num = get_value(str);



            return num;
        }
        public int get_软件版本()
        {
            int num = 0;

            string str = read_reg32bit("P0.000");
            num = get_value(str);

            //"35秒728ms:7F0304279300009EAD"
            //27930000

            return num;
        }
        /// 
        /// 获取故障码
        /// "P0.001"
        /// 
        /// 
        /// 
        public int get_故障()
        {//报警:故障码
            int num = 0;

            string str = read_reg32bit("P0.001");
            num = get_value(str);


            return num;
        }
        /// 
        /// 故障记录
        /// "P4.000""P4.001""P4.002"P4.003""P4.004"
        /// 
        /// 
        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();
        }
        /// 
        /// 伺服启动时间"P0.008"
        /// 
        /// 
        public int get_伺服启动时间()
        {//报警:故障码
            int num = 0;

            string str = read_reg32bit("P0.008");
            num = get_value(str);

            return num;
        }

        /// 
        /// 获取电机位置
        /// "P5.016"
        /// 
        /// 
        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
        /// 
        /// 设置通讯从站(编号)
        /// 
        /// 默认0x7F
        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单位

        /// 
        /// 初始化:基础通讯
        /// 网口:4负(B)  5正(A)
        /// 
        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

        }

        /// 
        /// 纯PT模式
        /// 
        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);//分度总行程


        }

        /// 
        /// 纯外部端子脉冲输入
        /// 要重启
        /// 
        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



        }

        /// 
        /// 总线定位
        /// 要重启
        /// 
        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;
        }

        /// 
        /// 总线定位+力矩
        /// 要重启
        /// 
        /// 力矩
        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;
        }

        /// 
        /// 设置DI  "P4.007"
        /// 
        /// 
        /// 
        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;
        }


        /// 
        /// 模拟输出监控 P0.003
        /// 0 电机速度
        /// 1 电机扭矩
        /// 2 脉冲命令频率
        /// 3 速度命令
        /// 4 扭矩命令
        /// 5 VBUS 电压
        /// 6 P1.101 的设定值
        /// 7 P1.102 的设定值
        /// 
        /// 0~7
        /// 0~7
        /// 
        public string set_模拟输出监控(Int32 MON1, Int32 MON2)
        {//模拟输出监控

            string str = read_reg32bit("P0.003");
            return str;
        }

        /// 
        /// 驱动器显示//ushort num = (ushort)(LEDshow)Enum.Parse(typeof(LEDshow), comboBox1.Text);
        /// 
        /// 
        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;
        }
        /// 
        /// "P5.008"
        /// 
        /// 
        /// 
        public int set_正软限位(Int32 data)
        {
            int end = 0;

            string str = set_reg32bit("P5.008", data);
            end = get_value(str);

            return end;
        }
        /// 
        /// "P5.009"
        /// 
        /// 
        /// 
        public int set_负软限位(Int32 data)
        {
            int end = 0;
            string str = set_reg32bit("P5.009", data);
            end = get_value(str);
            return end;
        }
        /// 
        /// 电子齿轮比
        /// "P1.044"分子
        /// 
        /// 
        /// 
        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;
        }

        /// 
        /// 精度:位置确认范围"P1.054",误差报警值"P2.035"
        /// 默认167772
        /// 167772/16777216    //24bit
        /// // 正负 1%度
        /// 
        /// 电机一圈16777216
        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;
        }
        /// 
        /// 力矩报警阀值
        /// P1.057防撞百分比 0~300 
        /// P1.058时间1~1000ms
        /// 
        /// 0~300%
        /// 1~1000ms
        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

        }
        /// 
        /// 内部扭矩限制 1
        /// "P1.002"=0x0010
        /// "P1.012"
        /// 
        /// 
        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;

        }
        /// 
        /// 回零力矩P1.87,确认延时P1.88(2~2000ms)
        /// v1.02版本 基础值是10+设定值
        /// 
        /// 力矩
        /// 时间,小于2000ms
        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



        }
        /// 
        /// 机械回零
        /// 呼叫执行 PR# 0 回原点 P5.007=0;
        /// 
        /// 回零力矩
        /// 确认时间,小于2000ms
        /// 立即执行bool
        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   空
                                               //D5  0   延时时间索引           0(P5.040) ~  F(P5.055)
                                               //D4  0   第2次回零减速时间索引  0(P5.020) ~  F(P5.035)  P5.006=200转
                                               //D3  0   第1次回零减速时间索引  0(P5.020) ~  F(P5.035)  P5.005=1000转 (200ms~8000ms)  0.200ms 1.300ms 2.500ms 3.600ms 4.800ms 5.900ms 6.1000ms   //F.30ms(范围1~1200ms)
                                               //D2  0   自动加速时间索引       0(P5.020) ~  F(P5.035)
                                               //
                                               //D1  0   回零之后       00(停止)01(#1) ~63(#99)
                                               //D0  0
            str = set_reg32bit("P6.000", 0x00000000);//32bit原点复归定义 //参数定义   DCBA  UZYX  (YX00#编号)z加速时间P5.020 u第一减速 a第二减速 b DLY延时 d 1开机回零点

            str = set_reg32bit("P6.001", 0);//32bit原点定义值   //参考点偏移 ?( Z脉冲宽度大概152~156
                                            //PR#
                                           
            if (run)
            {
                str = set_reg16bit("P5.007", 0);//bit16直接呼叫    PR#0    机械回零
            }

        }


        public string set_CH1校正(UInt16 data)
        {
            string str = string.Empty;

            str = set_reg16bit("P2.008", 22);
            str = set_reg16bit("P4.020", data);//P2.008要开 22



            return str;
        }
        public string set_CH2校正(UInt16 data)
        {
            //Task.Run(() => { });
            string str = set_reg16bit("P2.008", 22);
            str = set_reg16bit("P4.021", data);//P2.008要开 22
            return str;
        }

        /// 
        /// 呼叫PR# 1~99
        /// "P5.007"
        /// 
        /// 
        public void set_PR呼叫(ushort num)//"P5.007"
        {
            //Task.Run(() => { });
            set_reg16bit("P5.007", num);
        }


        #endregion

        #endregion

        #region PR+T  模式(混合模式:定位加力矩)
        //=======定位加力矩========================================================
        #region 开关量初始化

        /// 
        /// PR+T 模式初始化DI
        /// 设置DI  初始化 开关量 端子输入
        /// 
        public void set_DI_init_PRT()//  PR+T  输入初始化
        {
            #region 说明
            //L型机:
            //(方向:35+24v,39+3.3v,37-GND)
            //(脉冲:36+24v,43+3.3v,41-GND)
            //18力矩输入
            //20速度输入
            //===============================
            //极性和功能//   | 0x100是常开
            //DI1 ~ DI8: P2.010 ~ P2.017
            //DI9 ~DI13: P2.036 ~ P2.040

            //来源
            //P3.006 输入接点(DI)来源   Bit 12 ~ Bit 0 对应至 DI13 ~ DI1;
            //0:输入接点状态由外部硬件端子控制。
            //1:输入接点状态由系统参数 P4.007 控制。

            //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     扭矩/位置混和模式命令---选择切换   高电平:力矩模式
            // 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     STP_电机停止
            // DI 13  P2.040    100   软件读取位(拉高,以免读取DI是00)      
            #endregion

            //输入开关信号滤波 0~20ms
            set_reg16bit("P2.009", 0);//开关过滤杂波  0~20   单位:ms 毫秒
                                      //===DI源===============================
            set_reg16bit("P3.006", 0x1FFF);//开关量来源0x1FFF(bit12~0) 1内部 P4.007
                                           //===断电丢失=============================
            set_reg16bit("P2.010", 0x100 | (ushort)io_in_功能.SON_伺服使能);//DI 1端子定义   01   DCBA:C(0:接常闭,1接常开)BA功能码
            set_reg16bit("P2.011", 0x100 | (ushort)io_in_功能.CTRG_PR模式节拍_上升沿);//DI 2端子定义
            set_reg16bit("P2.012", 0x100 | (ushort)io_in_功能.POS0_PR模式码段);//DI 3端子定义
            set_reg16bit("P2.013", 0x100 | (ushort)io_in_功能.POS1_PR模式码段);//DI 4端子定义
            set_reg16bit("P2.014", 0x100 | (ushort)io_in_功能.TCM0_多段力矩切换);//DI 5端子定义
            set_reg16bit("P2.015", 0x100 | (ushort)io_in_功能.TCM1_多段力矩切换);//DI 6端子定义
            set_reg16bit("P2.016", 0x100 | (ushort)io_in_功能.T_P_力矩位置模式);//DI 7端子定义
            set_reg16bit("P2.017", (ushort)io_in_功能.EMGS_急停开关);//DI 8端子定义  // 不接开关应为急停报警 AL13
            set_reg16bit("P2.036", 0x100 | (ushort)io_in_功能.ARST_复位);//DI 9端子定义
            set_reg16bit("P2.037", 0x100 | (ushort)io_in_功能.JOGU_正点动);//DI 10端子定义
            set_reg16bit("P2.038", 0x100 | (ushort)io_in_功能.JOGU_负点动);//DI 11端子定义
            set_reg16bit("P2.039", 0x100 | (ushort)io_in_功能.STP_电机停止);//DI 12端子定义
                                                                      //set_reg("P2.040", (ushort)io_in_功能.ARST_复位 | 0x100);//DI 13端子定义
                                                                      //初始化开关状态
            set_DI(0 |//0x0051
                1 << 0    //DI1   使能
                | 0 << 1   //DI2
                | 0 << 2   //DI3
                | 0 << 3
                | 1 << 4   //DI5   力矩1
                | 0 << 5
                | 1 << 6//DI7   0纯力矩    1定位+力矩
                | 0 << 7
                | 0 << 8
                | 0 << 9
                | 0 << 10
                | 0 << 11
                | 0 << 12//DI13脚。

                );
        }

        /// 
        /// PR+T 模式初始化DO
        /// 设置D0初始化   端子输出
        /// 
        public void set_DO_init_PRT()//  PR+T  输出初始化
        {

            //   + 0x100是常开

            // DO 1   01    SRDY    伺服准备完成
            // DO 2   03    ZSPD    电机零速度
            // DO 3   04    TSPD    目标速度到达
            // DO 4   05    TPOS    目标位置到达
            // DO 5   07    ALRM    伺服警示
            // DO 6   端子定义100  关
            set_reg16bit("P2.018", 0x100 | (ushort)io_out_功能.SRDY_伺服上电);//DO 1端子定义101  电源
            set_reg16bit("P2.019", 0x100 | (ushort)io_out_功能.ZSPD_零速);//DO 2端子定义103  零速
            set_reg16bit("P2.020", 0x100 | (ushort)io_out_功能.TSPD_到速);//DO 3端子定义109  原点复归完成, 坐标有效
            set_reg16bit("P2.021", 0x100 | (ushort)io_out_功能.TPOS_到位);//DO 4端子定义105  坐标到位信号(参数 P1.054 设定值)
            set_reg16bit("P2.022", 0x100 | (ushort)io_out_功能.ALRM_故障);//DO 5端子定义007  伺服故障
            set_reg16bit("P2.041", 0x100 | (ushort)io_out_功能.BRKR_刹车线);//DO 6端子定义100  关   0x100是常开

        }



        #region IO 操作

        /// 
        /// 按钮开关:置位
        /// 
        /// 开关位置
        /// 
        public bool key_置位(UInt32 key)
        {

            UInt32 start = (UInt32)get_DI();//获取开关量   //0x00000051
            if (start == 0)//错误帧
            {//不应该进入这里,应答数据帧错了
                string str = rs485.help_SerialPort.get_应答报文.ToString();//检查
                return false;
            }
            UInt32 end = start;//记录原始数据

            start &= key;    //获取开关状态   start  0x00000001

            set_DI((int)(end |= key));   //开
            return true;
        }

        /// 
        /// 按钮开关:复位
        /// 
        /// 开关位置
        /// 
        public bool key_复位(UInt32 key)
        {

            UInt32 start = (UInt32)get_DI();//获取开关量   //0x00000051
            if (start == 0)//错误帧
            {//不应该进入这里,应答数据帧错了
                string str = rs485.help_SerialPort.get_应答报文.ToString();//检查
                return false;
            }
            UInt32 end = start;//记录原始数据

            start &= key;    //获取开关状态   start  0x00000001

            //& 关
            key = ~key;//0xfffffffe
            end &= key; //bit   关  
            set_DI((int)end);//执行关闭
            return false;

        }

        /// 
        /// 按钮开关:翻转
        /// 
        /// 
        /// 
        public int key_翻转(UInt32 key)
        {//不能用Task(不能让本层与ui并列运行)
            UInt32 k_开关 = key;
            UInt32 k_复位 = ~key;
            UInt32 k_状态 = 0;
            UInt32 start = (UInt32)get_DI();//获取开关量   //0x00000051
            if (start == 0)//错误帧
            {//不应该进入这里,应答数据帧错了
                string str = rs485.help_SerialPort.get_应答报文.ToString();//检查
                key_置位((int)io_DI.ARST复位);//复位驱动器(使下次读,不会为0)
                return 4;
            }
            k_状态 = start;//记录原始数据

            k_状态 = start & key;    //获取开关状态   start  0x00000001
            if (k_状态 == 0)
            {//====开==============================
                set_DI((int)(start |= key));

                //====调查结果========================
                int st1 = get_DI();
                int st = st1 & (int)key;
                if (st > 0)
                {
                    return 1; // 结果 ok
                }
                return 0;
            }
            else
            {//====关==============================
                k_状态 = start & k_复位;//bit   关

                set_DI((int)k_状态);//执行关闭

                //====调查结果========================
                int st1 = get_DI();
                int st = st1 & (int)key;
                if (st > 0)
                {
                    return 1; // 结果 ok
                }
                return 0;
            }


        }


        //set_DI(ushort start)
        public int set_DI_使能_PRT()
        {
            return key_翻转((int)io_DI.伺服使能);
            //set_DI(0 |
            //       1 << 0  //使能
            //               //| 1 << 1// PR#  跳跃
            //               //| 1 << 2// pos0 索引
            //               //| 1 << 3// pos1
            //       | 1 << 4// t0  力矩
            //               //| 1 << 5// t1
            //       | 1 << 6// t/p 切换(0:力矩模式   1:PR模式)
            //               //| 1 << 7// 急停  (默认常闭,所以通电取反)
            //               //| 1 << 8// 复位
            //               //| 1 << 9// 正
            //               //| 1 << 10//反
            //               //| 1 << 11
            //               //| 1 << 12
            //     );
        }
        public bool set_b备用使能()
        {
            set_DI(0 |
                   1 << 0  //使能
                           //| 1 << 1// PR#  跳跃
                           //| 1 << 2// pos0 索引
                           //| 1 << 3// pos1
                   | 1 << 4//力矩t0
                           //| 1 << 5//力矩t1
                   | 1 << 6// t/p 切换(0:纯力矩模式   1:PR模式)
                           //| 1 << 7// 急停  
                           //| 1 << 8// 复位
                           //| 1 << 9// 正
                           //| 1 << 10//反
                           //| 1 << 11
                           //| 1 << 12
                 );
            return true;
        }

        /// 
        /// T/P 切换
        /// 0:T力矩模式
        /// 1:P定位+T力矩模式
        /// 
        /// 
        public int set_DI_TP切换_PRT()
        {// 0:t纯力矩   1:p定位带力矩

            return key_翻转((int)io_DI.TP力定切换);

            //key_置位((int)io_DI.TCM0力矩);//力矩1号
            //return key_翻转((int)io_DI.TP力定切换);
            //Task.Run(() =>
            //{
            //return set_DI(0
            //         //1 << 0  //使能
            //         //| 1 << 1// PR#
            //         //| 1 << 2// pos0 位置
            //         //| 1 << 3// pos1
            //         //| 1 << 4// t0  力矩
            //         //| 1 << 5// t1
            //         | 1 << 6// t/p 切换(0:力矩模式   1:PR模式)
            //                 //| 1 << 7// 急停  (默认常闭,所以通电取反)
            //                 //| 1 << 8// 复位
            //                 //| 1 << 9// 正
            //                 //| 1 << 10//反
            //                 //| 1 << 11
            //                 //| 1 << 12
            //         );
            //});
        }
        public int set_DI_急停_PRT()
        {

            return key_翻转((int)io_DI.EMGS急停);
            //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     扭矩/位置混和模式命令---选择切换   高电平:PR模式
            // 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    100  关    常开
            // DI 13  P2.040    100  关    常开      

            复位
            //set_DI(0
            //         //1 << 0  //使能
            //         //| 1 << 1// PR#
            //         //| 1 << 2// pos0 位置
            //         //| 1 << 3// pos1
            //         //| 1 << 4// t0  力矩
            //         //| 1 << 5// t1
            //         | 1 << 6// t/p 切换(0:力矩模式   1:PR模式)
            //                 //| 1 << 7// 急停  (默认常闭,所以通电取反)
            //                 | 1 << 8// 复位
            //                         //| 1 << 9// 正
            //                         //| 1 << 10//反
            //                         //| 1 << 11
            //                         //| 1 << 12
            //         );
        }
        public void set_DI_复位_PRT()
        {

            key_翻转((int)io_DI.ARST复位);
            //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     扭矩/位置混和模式命令---选择切换   高电平:PR模式
            // 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    100  关    常开
            // DI 13  P2.040    100  关    常开      

            复位
            //set_DI(0
            //         //1 << 0  //使能
            //         //| 1 << 1// PR#
            //         //| 1 << 2// pos0 位置
            //         //| 1 << 3// pos1
            //         //| 1 << 4// t0  力矩
            //         //| 1 << 5// t1
            //         | 1 << 6// t/p 切换(0:力矩模式   1:PR模式)
            //                 //| 1 << 7// 急停  (默认常闭,所以通电取反)
            //                 | 1 << 8// 复位
            //                         //| 1 << 9// 正
            //                         //| 1 << 10//反
            //                         //| 1 << 11
            //                         //| 1 << 12
            //         );
        }
        /// 
        /// 正点动
        /// 
        /// 速度
        public void set_DI_jogu_正点动_PRT(UInt16 speed)
        {//正转

            set_reg16bit("P4.005", speed); //点动速度
            key_翻转((int)io_DI.正转);

        }
        /// 
        /// 负点动
        /// 
        /// 速度
        public int set_DI_jogu_负点动_PRT(UInt16 speed)
        {//反转

            set_reg16bit("P4.005", speed); //点动速度
            return key_翻转((int)io_DI.反转);
        }


        #endregion


        #endregion

        #region 初始化 PR+T
        /// 
        /// PR+T模式
        /// 0:纯力矩   1:定位加力矩 (T/P 引脚)
        /// 
        public void set_PRT_Mode_init_定位加力矩模式_初始化()  // 模式初始化
        {//以这个为主
            #region 说明
            //伺服模式PR
            //P5.004=0x0109 原点复归模式
            //P5.005 第一段高速原点复归速度设定
            //P5.007■ PR 命令触发缓存器写入 0 表示开始原点复归;
            //写入 1 ~ 99 表示开始执行指定 PR 程序,相当于 DI.CTRG + POSn。
            //P5.008 软件极限:正向
            //P5.009 软件极限:反向
            //P5.015=0x0011 ■ PATH#1 ~ PATH#2 数据断电不记忆设定
            //P5.016■ 轴位置-电机编码器
            //P5.018 轴位置-脉冲命令
            //
            //P6.000=0x 1000  0000 原点复归定义
            //P6.001 原点坐标
            //
            //P6.002=0x0000 0011,    #1
            //P6.003=坐标
            //P6.004=0x0000 0011,    #2
            //P6.005=坐标
            //
            #endregion
            string str, str1, str2;

            #region  重要参数
            //===========================================================================================================
            //set_电子齿轮比(1677726, 100000,5,-1,4900.00);//167 77216    /  10 0000
            set_电子齿轮比(1, 1, 5.0, -1, 485.00);//167 77216    /  10 0000  (127.99圈* 5mm导程)
            //====齿轮比需要手动设置====================================================================================

            str1 = set_reg16bit("P1.055", 3000);//最大转速限制
            str2 = set_reg16bit("P1.056", 20);//预过载百分比0~120
            /* 这参数很重要,低于导轨最大受力值  */
            set_motor_防撞保护(40, 10);//防撞百分比 0~300力矩, 防撞时间过滤1~1000ms  P1.057
            /* 这参数很重要,低于导轨最大受力值  */
            set_PR_ZERO_机械回零(4, 2000, false);//回零力矩,确认时间20转2秒
                                             //===伺服LED显示屏========================================================开机显示=============
                                             //str1 = set_reg16bit("P0.002", (UInt16)LEDshow.L39DI状态);//伺服显示屏:39 DI
            str1 = set_reg16bit("P0.002", (UInt16)LEDshow.L0电机坐标PUU理论坐标);

            str = set_reg16bit("P1.000", 0x1002);//脉冲+符号,
            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 (由DI的TCM0~1决定力矩来源)
            str2 = set_reg16bit("P1.012", 13);//开启扭力限制(1号扭力值: XX牛米)

            set_DI_init_PRT();//  PR-T  输入引脚初始化
            set_DO_init_PRT();
            //======================================================
            Gcode_init_G代码初始化();//G00和G01的功能

            #endregion




            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", 20);//伺服使能后电磁刹车释放延时ms(最大1000ms)
            str = set_reg16bit("P1.043", 20);//脱机后刹车抱闸延时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);//分度总行程

            //=== PR# 1 ==============================
            // G00 快速定位
            //str = set_reg32bit("P5.075", (UInt16)(speed * 10.0));//速度索引F段  :设置速度  倍率10
            //str = set_reg32bit("P5.021", 300);//加速索引1段  :设置时间 ms
            //str = set_reg32bit("P5.022", 200);//减速索引2段  :设置时间 ms

            //=== PR# 2 ==============================
            // G01 金加工速度
            //str = set_reg32bit("P5.035", 30);//加速索引F段  :设置时间 ms
            //str = set_reg32bit("P5.034", 20);//减速索引E段  :设置时间 ms




        }



        #endregion

        #region 定位操作
        public void Gcode_init_G代码初始化()
        {
            string str = string.Empty;
            //G00索引
            str = set_reg32bit("P5.021", 3000);//加速索引1段  :设置时间 ms
            str = set_reg32bit("P5.022", 200);//减速索引2段  :设置时间 ms
            //D7  0   空
            //D6  0   自动下一步PR#     0关
            //D5  0   延时时间索引         0(P5.040) ~  F(P5.055) 0ms~5500毫秒  //定位完成后再延时0ms
            //D4  F   SPD目标速度索引      0(P5.060) ~  F(P5.075) 20转~3000转 0.20转 1.50转 2.100 3.200 4.300 5.500 6.600 7.800 8.1000 9.1300 A.1500 B.1800 C.2000 D.2300 E.2500 F.3000转
            //D3  2   DEC减速时间索引      0(P5.020) ~  F(P5.035) 200ms~8000ms    0.200ms 1.300ms 2.500ms 3.600ms 4.800ms 5.900ms 6.1000ms   //F.30ms(范围1~1200ms)

            //D2  1   ACC加速时间索引      0(P5.020) ~  F(P5.035) //F.30ms(范围1~1200ms)
            //D1  3   OPT工作模式下的补充(TYPE工作模式2时)     bit3bit2CMD=00ABS绝对定位 01REL相对定位 10INC光栅尺绝对定位 11CAP光栅尺相对定位   bit1本段PR#进入减速时允许下一PR#加入   bit0允许打断前一任务
            //D0  2   TYPE工作模式: 1定速 2定位单步 3自动定位PR#下一步 7呼叫PR#跳跃 8写参数到路径 A分度定位  (240页)
            str = set_reg32bit("P6.002", 0x000F2132);//单步定位,绝对值定位,允许在减速时插入下一PR#路径,允许打断当前旋转,  速度来源 F段速度,

            //G01索引
            str = set_reg32bit("P5.035", 30);//加速索引F段  :设置时间 ms
            str = set_reg32bit("P5.034", 20);//减速索引E段  :设置时间 ms
            str = set_reg32bit("P6.004", 0x000Aef32);//A段速度<1500

        }

        /// 
        /// G00快速定位(速度,坐标)
        /// 
        /// 速度
        /// 坐标
        /// 立即旋转
        /// 轴地址:从站号
        public void G00(AXIS axis, double  where, double speed, bool run)
        {//PR#1
            string str = string.Empty;
            if (speed > 30000) // 3000转
            {
                speed = 30000;
            }
            if (axis == AXIS.X)
            {
                help_ModBus.address = 0x7f;//从站
            }
            else { return ; }



            //str = set_reg32bit("P5.075", (UInt16)(speed * 10.0));//速度索引F段  :设置速度  倍率10
            str = set_reg32bit("P5.075", (UInt16)(speed));
            //str = set_reg32bit("P5.021", 300);//加速索引1段  :设置时间 ms
            //str = set_reg32bit("P5.022", 200);//减速索引2段  :设置时间 ms
            //D7  0   空
            //D6  0   自动下一步PR#     0关
            //D5  0   延时时间索引         0(P5.040) ~  F(P5.055) 0ms~5500毫秒  //定位完成后再延时0ms
            //D4  F   SPD目标速度索引      0(P5.060) ~  F(P5.075) 20转~3000转 0.20转 1.50转 2.100 3.200 4.300 5.500 6.600 7.800 8.1000 9.1300 A.1500 B.1800 C.2000 D.2300 E.2500 F.3000转
            //D3  2   DEC减速时间索引      0(P5.020) ~  F(P5.035) 200ms~8000ms    0.200ms 1.300ms 2.500ms 3.600ms 4.800ms 5.900ms 6.1000ms   //F.30ms(范围1~1200ms)

            //D2  1   ACC加速时间索引      0(P5.020) ~  F(P5.035) //F.30ms(范围1~1200ms)
            //D1  3   OPT工作模式下的补充(TYPE工作模式2时)     bit3bit2CMD=00ABS绝对定位 01REL相对定位 10INC光栅尺绝对定位 11CAP光栅尺相对定位   bit1本段PR#进入减速时允许下一PR#加入   bit0允许打断前一任务
            //D0  2   TYPE工作模式: 1定速 2定位单步 3自动定位PR#下一步 7呼叫PR#跳跃 8写参数到路径 A分度定位  (240页)
            //str = set_reg32bit("P6.002", 0x000F2132);//单步定位,绝对值定位,允许在减速时插入下一PR#路径,允许打断当前旋转,  速度来源 F段速度,
            str = set_reg32bit("P6.003", (int)(where*16777216/5.0));//PR# 1坐标(G00)
            if (run) set_PR呼叫(1);//定位PR#1
            #region 等待完成
            int i = 0;
            do
            {
                
                i++;
                int end = get_DO();
                if ((end & 1 << 3) > 0) break;
                if (i > 50) break;
            } while (true);
            #endregion

        }
        /// 
        /// G01金加工速度,小于1500转
        /// 
        /// 速度
        /// 定位坐标
        /// 立即旋转
        public void G01(AXIS axis, double  where, double speed, bool run)
        {//PR#2
            string str;
            if (speed > 15000) speed = 15000;//加工限速

            if (axis == AXIS.X)
            {
                help_ModBus.address = 0x7f;//从站
            }
            else
            {
                help_ModBus.address = 0x00;//从站
            }


            //str = set_reg32bit("P5.070", (UInt16)(speed * 10.0));//速度索引A段  :设置速度  倍率10
            str = set_reg32bit("P5.070", (UInt16)(speed));//速度索引A段  :设置速度

            //str = set_reg32bit("P5.035", 130);//加速索引F段  :设置时间 ms
            //str = set_reg32bit("P5.034", 20);//减速索引E段  :设置时间 ms
            //D7  0   空
            //D6  0   自动下一步     0关
            //D5  0   延时时间索引         0(P5.040) ~  F(P5.055) 0ms~5500毫秒   P5.040=0ms;
            //D4  A   SPD目标速度索引      0(P5.060) ~  F(P5.075) 20转~3000转     20转~3000转 0.20 1.50 2.100 3.200 4.300 5.500 6.600 7.800 8.1000 9.1300 A.1500 B.1800 C.2000 D.2300 E.2500 F.3000转
            //D3  E   DEC减速时间索引      0(P5.020) ~  F(P5.035) 200ms~8000ms    0.200ms 1.300ms 2.500ms 3.600ms 4.800ms 5.900ms 6.1000ms   //F.30ms(范围1~1200ms)
            //D2  F   ACC加速时间索引      0(P5.020) ~  F(P5.035) 
            //D1  3   OPT工作模式下的补充(TYPE工作模式2时)     bit3bit2CMD=00ABS绝对定位 01REL相对定位 10INC光栅尺绝对定位 11CAP光栅尺相对定位   bit1本段PR#进入减速时允许下一PR#加入   bit0允许打断前一任务
            //D0  2   TYPE工作模式: 1定速 2定位单步 3自动定位PR#下一步 7呼叫PR#跳跃 8写参数到路径 A分度定位  (240页)
            //str = set_reg32bit("P6.004", 0x000Aef32);//A段速度<1500
            str = set_reg32bit("P6.005", (int)(where*16777216/5.0));//PR# 2坐标(G01)
            if (run) set_PR呼叫(2);//定位PR#2
            #region 等待完成
            int i = 0;
            do
            {

                i++;
                int end = get_DO();
                if ((end & 1 << 3) > 0) break;
                if (i > 50) break;
            } while (true);
            #endregion
        }


        #endregion

        #endregion
        //这个放弃
        #region PR 模式
        #region IO 操作 
        //设置DI初始化   开关量 端子输入
        public void set_io_DI_init()
        {//L型机:方向 35和37接24v    脉冲 36和41接24v      18力矩输入    20速度输入


            //极性和功能//   | 0x100是常开
            //DI1 ~ DI8: P2.010 ~ P2.017
            //DI9 ~DI13: P2.036 ~ P2.040

            //来源
            //P3.006 输入接点(DI)来源控制开关 Bit 12 ~ Bit 0 对应至 DI13 ~ DI1;
            //0:输入接点状态由外部硬件端子控制。
            //1:输入接点状态由系统参数 P4.007 控制。

            //P4.007  bit对应开关状态 
            //
            // DI 1  P2.010     101  使能    常开
            // DI 2  P2.011     137  正点动
            // DI 3  P2.012     138  反点动
            // DI 4  P2.013     117  力矩  TCM0_多段力矩切换 = 0x16,TCM1_多段力矩切换 = 0x17,       //116
            // DI 5  P2.014     102  复位
            // DI 6  P2.015     022  负限位
            // DI 7  P2.016     023  正限位
            // DI 8  P2.017     021  急停开关   常闭
            // DI 9  P2.036     100  关    常开
            // DI 10  P2.037    100  关    常开
            // DI 11  P2.038    100  关    常开
            // DI 12  P2.039    100  关    常开
            // DI 13  P2.040    100  关    常开      

            //输入开关信号滤波 0~20ms
            set_reg16bit("P2.009", 0);//开关过滤杂波  0~20   单位:ms 毫秒
            //==================================
            set_reg16bit("P3.006", 0x1FFF);//开关量来源0x1FFF(bit12~0)  0端子  1内部 P4.007
            //===断电丢失=============================
            set_reg16bit("P2.010", (ushort)io_in_功能.SON_伺服使能 | 0x100);//DI 1端子定义   01   DCBA:C(0:接常闭,1接常开)BA功能码
            set_reg16bit("P2.011", (ushort)io_in_功能.JOGU_正点动 | 0x100);//DI 2端子定义
            set_reg16bit("P2.012", (ushort)io_in_功能.JOGU_负点动 | 0x100);//DI 3端子定义
            set_reg16bit("P2.013", (ushort)io_in_功能.TCM0_多段力矩切换 | 0x100);//DI 4端子定义
            set_reg16bit("P2.014", (ushort)io_in_功能.ARST_复位 | 0x100);//DI 5端子定义
            //set_reg("P2.015", 0);//DI 6端子定义
            //set_reg("P2.016", 0);//DI 7端子定义
            //set_reg("P2.017", 0);//DI 8端子定义
            //set_reg("P2.036", 0);//DI 9端子定义
            //set_reg("P2.037", 0);//DI 10端子定义
            //set_reg("P2.038", 0);//DI 11端子定义
            //set_reg("P2.039", 0);//DI 12端子定义
            //set_reg("P2.040", (ushort)io_in_功能.ARST_复位 | 0x100);//DI 13端子定义
        }

        //设置D0初始化   端子输出
        public void set_io_DO_init()
        {
            //   + 0x100是常开

            // DO 1   端子定义101  电源
            // DO 2   端子定义103  零速
            // DO
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章