CAN_Address.cs 8.2 KB
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PUSICANLibrary
{
    public class CAN_Address
    {
        private static Dictionary<uint, SDOAddrInfo> sdoMap = null;
        public static Dictionary<uint, SDOAddrInfo> SDOAddrMap()
        {
            if (sdoMap == null)
            {
                sdoMap = new Dictionary<uint, SDOAddrInfo>();

                sdoMap.Add(NodeID, new SDOAddrInfo(NodeID, DATA_TYPE.DT_UINT8, 0));
                sdoMap.Add(BoteValue, new SDOAddrInfo(BoteValue, DATA_TYPE.DT_UINT8, 0));

                sdoMap.Add(NodeName, new SDOAddrInfo(NodeName, DATA_TYPE.DT_VISIBLE_STRING, 0));
                sdoMap.Add(DeviceVersion, new SDOAddrInfo(DeviceVersion, DATA_TYPE.DT_VISIBLE_STRING, 0));
                sdoMap.Add(SoftVersion, new SDOAddrInfo(SoftVersion, DATA_TYPE.DT_VISIBLE_STRING, 0));

                sdoMap.Add(DeviceStatus, new SDOAddrInfo(DeviceStatus, DATA_TYPE.DT_UINT8, 0));
                sdoMap.Add(ControlStatus, new SDOAddrInfo(ControlStatus, DATA_TYPE.DT_UINT8, 0));
                sdoMap.Add(MoveDirection, new SDOAddrInfo(MoveDirection, DATA_TYPE.DT_UINT8, 0));
                sdoMap.Add(StopMove, new SDOAddrInfo(StopMove, DATA_TYPE.DT_UINT8, 0));
                sdoMap.Add(MoveType, new SDOAddrInfo(MoveType, DATA_TYPE.DT_UINT8, 0));
                sdoMap.Add(DelPhaseCurrent, new SDOAddrInfo(DelPhaseCurrent, DATA_TYPE.DT_UINT8, 0));
                sdoMap.Add(MotorCanMake, new SDOAddrInfo(MotorCanMake, DATA_TYPE.DT_UINT8, 0));

                sdoMap.Add(OutStop_ParamCount, new SDOAddrInfo(OutStop, DATA_TYPE.DT_UINT8, 0));
                sdoMap.Add(OutStop_Set, new SDOAddrInfo(OutStop, DATA_TYPE.DT_UINT8, 1));
                sdoMap.Add(OutStop_Type, new SDOAddrInfo(OutStop, DATA_TYPE.DT_UINT8, 2));

                sdoMap.Add(AddSpeed, new SDOAddrInfo(AddSpeed, DATA_TYPE.DT_UINT16, 0));
                sdoMap.Add(StopSpeed, new SDOAddrInfo(StopSpeed, DATA_TYPE.DT_UINT16, 0));
                sdoMap.Add(StartSpeed, new SDOAddrInfo(StartSpeed, DATA_TYPE.DT_UINT16, 0));
                sdoMap.Add(DelSpeed, new SDOAddrInfo(DelSpeed, DATA_TYPE.DT_UINT16, 0));
                sdoMap.Add(MicroStepping, new SDOAddrInfo(MicroStepping, DATA_TYPE.DT_UINT16, 0));
                sdoMap.Add(MaxPhaseCurrent, new SDOAddrInfo(MaxPhaseCurrent, DATA_TYPE.DT_UINT16, 0));
                 
                sdoMap.Add(MaxSpeed, new SDOAddrInfo(MaxSpeed, DATA_TYPE.DT_UINT32, 0));
                sdoMap.Add(RelativeMove, new SDOAddrInfo(RelativeMove, DATA_TYPE.DT_UINT32, 0));
                sdoMap.Add(AbsoluteMove, new SDOAddrInfo(AbsoluteMove, DATA_TYPE.DT_UINT32, 0));
              //  sdoMap.Add(MoveDirection, new SDOAddrInfo(MoveDirection, DATA_TYPE.DT_UINT32, 0));
                sdoMap.Add(CurrPosition, new SDOAddrInfo(CurrPosition, DATA_TYPE.DT_UINT32, 0));
                sdoMap.Add(OutStop, new SDOAddrInfo(OutStopSingle, DATA_TYPE.DT_UINT8, 0));
                sdoMap.Add(GPIO_Value, new SDOAddrInfo(GPIO_Value, DATA_TYPE.DT_INT16, 0));
            }
            return sdoMap;
        }
        /// <summary>
        /// 节点ID
        /// </summary>
        public static uint NodeID = 0x2002;

        /// <summary>
        /// 波特率
        /// </summary>
        public static uint BoteValue = 0x2003;
        /// <summary>
        /// 设备节点名称
        /// </summary>
        public static uint NodeName = 0x1008;
        /// <summary>
        /// 硬件版本
        /// </summary>
        public static uint DeviceVersion = 0x1000;
        /// <summary>
        /// 软件版本= 0x100A
        /// </summary>
        public static uint SoftVersion = 0x100A;

        /// <summary>
        /// 驱动错误状态= 0x6000
        /// </summary>
        public static uint DeviceStatus = 0x6000;

        /// <summary>
        /// 控制器状态= 0x6001
        /// </summary>
        public static uint ControlStatus = 0x6001;


        /// <summary>
        /// 转动反向= 0x6002,0=正方向,1=反方向
        /// </summary>
        public static uint MoveDirection = 0x6002;
        /// <summary>
        /// 最大速度= 0x6003
        /// </summary>
        public static uint MaxSpeed = 0x6003;
        /// <summary>
        /// 相对位移指令= 0x6004
        /// </summary>
        public static uint RelativeMove = 0x6004;
        /// <summary>
        /// 工作模式= 0x6005,0=位置模式,1=速度模式
        /// </summary>
        public static uint MoveType = 0x6005;
        /// <summary>
        /// 启动速度= 0x6006
        /// </summary>
        public static uint StartSpeed = 0x6006;
        /// <summary>
        /// 停止速度= 0x6007
        /// </summary>
        public static uint StopSpeed = 0x6007;
        /// <summary>
        /// 加速度系数= 0x6008
        /// </summary>
        public static uint AddSpeed = 0x6008;
        /// <summary>
        /// 减速度系数= 0x6009
        /// </summary>
        public static uint DelSpeed = 0x6009;
        /// <summary>
        /// 细分数= 0x600A
        /// </summary>
        public static uint MicroStepping = 0x600A;
        /// <summary>
        /// 最大相电流0x600B
        /// </summary>
        public static uint MaxPhaseCurrent = 0x600B;
        /// <summary>
        /// 电流衰减0x600D
        /// </summary>
        public static uint DelPhaseCurrent = 0x600D;
        /// <summary>
        /// 电机位置0x600C
        /// </summary>
        public static uint CurrPosition = 0x600C;
        /// <summary>
        /// 电机使能 0x600E,0=脱机,1=电机使能
        /// </summary>
        public static uint MotorCanMake = 0x600E;
        /// <summary>
        /// 对象名称 外部紧急停止 0x60
        /// </summary>
        public static uint OutStopSingle = 0x600F;
        /// <summary>
        /// 绝对控制指令0x601c
        /// </summary>
        public static uint AbsoluteMove = 0x601c;
        /// <summary>
        /// 终止步进指令0x6020
        /// </summary>
        public static uint StopMove = 0x6020;
        /// <summary>
        /// 外部停止,0x600f 
        /// </summary>
        public static uint OutStop= 0x600F;
        /// <summary>
        /// 外部停止,0x600f ,0h 参数个数 UINT8 RO NO ROM
        /// </summary>
        public static uint OutStop_ParamCount = 0x600F0;
        /// <summary>
        /// 外部停止,1h 外部紧急停止使能 UINT8 RW NO
        /// </summary>
        public static uint OutStop_Set = 0x600F1;
        /// <summary>
        /// 外部停止,0x600f ,2h 外部紧急停止触发 
        /// </summary>
        public static uint OutStop_Type= 0x600F2;
        /// <summary>
        /// 通用IO端口值,0x6012 ,U16  0高电平,1低电平 
        /// </summary>
        public static uint GPIO_Value = 0x6012;

    }

    public class SDOAddrInfo
    {
        public SDOAddrInfo(uint addr, DATA_TYPE type, uint subindex)
        {
            this.sdoAddr = addr;
            this.dataType = type;

            switch (type)
            {
                case DATA_TYPE.DT_BOOL:
                    dataLength = 1;
                    break;
                case DATA_TYPE.DT_INT8:
                    dataLength = 1;
                    break;
                case DATA_TYPE.DT_INT16:
                    dataLength = 2;
                    break;
                case DATA_TYPE.DT_INT32:
                    dataLength = 4;
                    break;
                case DATA_TYPE.DT_UINT8:
                    dataLength = 1;
                    break;
                case DATA_TYPE.DT_UINT16:
                    dataLength = 2;
                    break;
                case DATA_TYPE.DT_UINT32:
                    dataLength = 4;
                    break;
                case DATA_TYPE.DT_VISIBLE_STRING:
                    dataLength = 255;
                    break;
            }

            this.subIndex = subindex;
        }
        /// <summary>
        /// 地址
        /// </summary>
        public uint sdoAddr { get; set; }

        public DATA_TYPE dataType { get; set; }

        public uint dataLength { get; set; }

        public uint subIndex { get; set; }

        public uint timeOut = 1000;
    }
}