ACCMDManager.cs 11.4 KB

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; 
namespace DeviceLib
{
    public class ACCMDManager
    {
        /// <summary>
        ///  0132h  原点接近传感器输入 (HOME)        状态 ReadOnly 0: 输入 OFF 1: 输入 ON
        /// </summary>
        internal static string Home_Single = "0132";

        /// <summary>
        ///  0022h 负方向驱动禁止输入(NOT) ReadOnly 0: 输入 OFF、 1: 输入 ON
        /// </summary>
        internal static string Limit_Negative_Single = "0022";

        /// <summary>
        /// 0023h 正方向驱动禁止输入(POT) ReadOnly 0: 输入 OFF、 1: 输入 ON
        /// </summary>
        internal static string Limit_Positive_Single = "0023";
        /// <summary>
        ///速度 4601
        /// </summary>
        internal static string Speed_Addr = "4601";
        /// <summary>
        /// 0060h 伺服 On 输入 (SRV-ON) 操作 R/W 0000h:输入 OFF、FF00h:输入 ON
        /// </summary>
        internal static string ServerOn_Addr = "0060";
        /// <summary>
        /// 0120h 选通输入 (STB) 操作 R/W 0000h:输入 OFF、FF00h:输入 ON
        /// </summary>
        internal static string STB_Addr = "0120"; 
        /// <summary>
        /// 0124h 减速停止输入 (S-STOP) 操作 R/W 0000h:输入 OFF、FF00h:输入 ON
        /// </summary>
        internal static string Stop_Addr = "0124"; 
        /// <summary>
        /// 0123h 紧急停止输入 (H-STOP) 操作 R/W 0000h:输入 OFF、FF00h:输入 ON
        /// </summary>
        internal static string SDStop_Addr = "0123";
        /// <summary>
        /// 0061h 报警清除输入 (A-CLR) 操作 R/W 0000h:输入 OFF、FF00h:输入 ON
        /// </summary>
        internal static string Clear_Alarm_Addr = "0061";


        /// <summary>
        /// 1020h Save all parameters - 0 - 4294967295 2 R/W 参数写入 EEPROM  写入“6173h”后,实行 EEPROM 写入
        /// </summary>
        internal static string EEPROM_Param_Addr = "1020";
        /// <summary>
        /// 目标位置=600B
        /// </summary>
        internal static string TargetPostion = "600B";
        /// <summary>
        /// 实际位置=600F
        /// </summary>
        internal static string ActualPosition = "600F";
         
        /// <summary>
        /// BUSY状态=0140,0140h 动作执行状态 (BUSY) ReadOnly 0:未执行 1:执行中
        internal static string BUSYStatus = "0140";
        /// <summary>
        /// HOME-CMP=0141,0141h 回原点完成状态 (HOME-CMP) ReadOnly 0:未完成 1:完成
        /// </summary>
        internal static string HOME_CMP_Status = "0141";
        /// <summary>
        /// 私服Ready状态,00A0h 伺服 Ready 状态 (S-RDY) ReadOnly 0:Ready OFF 1:Ready ON
        /// </summary>
        internal static string ServerOn_Status = "00A0";
        /// <summary>
        /// 报警状态=00A1,00A1h 报警状态 (ALM) ReadOnly 0:报警未发生 1:报警发生
        /// </summary>
        internal static string Alarm_Status = "00A1";
        /// <summary>
        /// 指定BlockNo=4414
        /// </summary>
        internal static string BlockNo = "4414";
        /// <summary>
        /// 读线圈01
        /// </summary>
        internal static byte CMD_ReadCoil= 0x01;
        /// <summary>
        /// 写线圈 05
        /// </summary>
        internal static byte CMD_WriteCoil = 0x05;
        /// <summary>
        /// 读寄存器03
        /// </summary>
        internal static byte CMD_ReadRegisters = 0x03;
        /// <summary>
        /// 写寄存器06
        /// </summary>
        internal static byte CMD_WriteRegisters = 0x06;
        /// <summary>
        /// 写多个线圈 0f
        /// </summary>
        internal static byte CMD_WriteMCoil = 0x0F;
        /// <summary>
        /// 写多个寄存器10
        /// </summary>
        internal static byte CMD_WriteMRegisters = 0x10;

        /// <summary>
        /// block0=原点返回,正方向
        /// </summary>
        internal static string Block_HomeMove0 = "0";
        /// <summary>
        /// block1=原点返回,反方向
        /// </summary>
        internal static string Block_HomeMove1 = "1";
        /// <summary>
        /// block2=绝对位置运动
        /// </summary>
        internal static string Block_AbsMove = "2";
        /// <summary>
        /// block3=相对位置运动
        /// </summary>
        internal static string Block_RelMove = "3";
        /// <summary>
        /// block4=正方向匀速运动
        /// </summary>
        internal static string Block_VolMove0 = "4";
        /// <summary>
        /// block5=反方向匀速运动
        /// </summary>
        internal static string Block_VolMove1 = "5";
        /// <summary>
        /// block6=减速停止
        /// </summary>
        internal static string Block_DelSpeedStop = "6";
        /// <summary>
        /// block7=紧急停止 
        /// </summary>
        internal static string Block_SuddenStop = "7";

        internal static byte[] buildCheckData(byte[] sendData, int length)
        {
            ushort pChecksum = 0;
            AcSerialBean.CalculateCRC(sendData, length, out pChecksum);
            string checkStr = Convert.ToString(pChecksum, 16);
            byte[] checkByte = AcSerialBean.StringToByte(checkStr);
            if (checkByte.Length == 1)
            {
                sendData[length] = checkByte[0];
                sendData[length + 1] = 0x00;
            }
            else
            {
                sendData[length + 1] = checkByte[0];
                sendData[length] = checkByte[1];
            }
            return sendData;
        }

        internal static byte[] GetWriteData(int slvAddr, byte cmd, string addr, string dataValue, int length)
        {
            // ( 2) 读取寄存器( 03h) 
            if (cmd.Equals(CMD_ReadRegisters))
            {
                return Get03WriteData(slvAddr, addr,length);
            }
            else if (cmd.Equals(CMD_WriteRegisters))
            {
                // ( 4) 写入寄存器( 06h)
                return Get06WriteData(slvAddr, addr, dataValue);
            }
            else if (cmd.Equals(CMD_WriteCoil))
            {
                return Get05WriteData(slvAddr, addr, dataValue);
            }
            else if (cmd.Equals(CMD_ReadCoil))
            {
                return Get01WriteData(slvAddr, addr, length);
            }

            return null;
        }

        private static byte[] Get05WriteData(int slvAddr, string addr, string dataValue)
        {
            byte[] sendData = new byte[8];
            sendData[0] = (byte)slvAddr;
            sendData[1] = CMD_WriteCoil;
            byte[] addrByte = AcSerialBean.StringToByte(addr.ToString());
            if (addrByte.Length == 1)
            {
                sendData[2] = 0x00;
                sendData[3] = addrByte[0];
            }
            else if (addrByte.Length == 2)
            {
                sendData[3] = addrByte[1];
                sendData[2] = addrByte[0];
            }

            byte[] dataByte = AcSerialBean.StringToByte(dataValue);
            if (dataByte.Length == 1)
            {
                sendData[4] = 0x00;
                sendData[5] = dataByte[0];
            }
            else if (dataByte.Length == 2)
            {
                sendData[5] = dataByte[1];
                sendData[4] = dataByte[0];
            }

            sendData = buildCheckData(sendData, sendData.Length - 2);
            return sendData;
        }
        private static byte[] Get01WriteData(int slvAddr, string  addr, int length)
        {
           
            byte[] sendData = new byte[8];
            sendData[0] = (byte)slvAddr;
            sendData[1] = CMD_ReadCoil;
            byte[] addrByte = AcSerialBean.StringToByte(addr.ToString());
            if (addrByte.Length == 1)
            {
                sendData[2] = 0x00;
                sendData[3] = addrByte[0];
            }
            else if (addrByte.Length == 2)
            {
                sendData[3] = addrByte[1];
                sendData[2] = addrByte[0];
            }

            byte[] dataByte = AcSerialBean.StringToByte(length.ToString());
            if (dataByte.Length == 1)
            {
                sendData[4] = 0x00;
                sendData[5] = dataByte[0];
            }
            else if (dataByte.Length == 2)
            {
                sendData[4] = dataByte[1];
                sendData[5] = dataByte[0];
            }

            sendData = buildCheckData(sendData, sendData.Length - 2);
            return sendData;
        }

        private static byte[] Get03WriteData(int slvAddr, string addr, int length)
        {
            //            ( 2) 读取寄存器( 03h)
            //发送
            //从站地址
            //03h
            //寄存器起始地址 高位
            //低位
            //寄存器数(N) 高位
            //低位
            //CRC 低位
            //高位
            byte[] sendData = new byte[8 ];
            sendData[0] = (byte)slvAddr;
            sendData[1] = CMD_ReadRegisters;
            byte[] addrByte = AcSerialBean.StringToByte(addr.ToString());
            if (addrByte.Length == 1)
            {
                sendData[2] = 0x00;
                sendData[3] = addrByte[0];
            }
            else if (addrByte.Length == 2)
            {
                sendData[3] = addrByte[1];
                sendData[2] = addrByte[0];
            }

            byte[] dataByte = AcSerialBean.StringToByte(length.ToString());
            if (dataByte.Length == 1)
            {
                sendData[4] = 0x00;
                sendData[5] = dataByte[0];
            }
            else if (dataByte.Length == 2)
            {
                sendData[4] = dataByte[1];
                sendData[5] = dataByte[0];
            }

            sendData = buildCheckData(sendData, sendData.Length-2);  
            return sendData;
        }

        private static byte[] Get06WriteData(int slvAddr, string addr, string dataValue)
        {
            // ( 4) 写入寄存器( 06h) 
            //从站地址
            //06h
            //地址 高位
            //低位
            //変更数据 高位
            //低位
            //CRC 低位
            //高位
            byte[] sendData = new byte[8];
            sendData[0] = (byte)slvAddr;
            sendData[1] = CMD_WriteRegisters;
            byte[] addrByte = AcSerialBean.StringToByte(addr.ToString());
            if (addrByte.Length == 1)
            {
                sendData[2] = 0x00;
                sendData[3] = addrByte[0];
            }
            else if (addrByte.Length == 2)
            {
                sendData[3] = addrByte[1];
                sendData[2] = addrByte[0];
            }

            byte[] dataByte = AcSerialBean.StringToByte(dataValue);
            if (dataByte.Length == 1)
            {
                sendData[4] = 0x00;
                sendData[5] = dataByte[0];
            }
            else if (dataByte.Length == 2)
            {
                sendData[4] = dataByte[0];
                sendData[5] = dataByte[1];

                //sendData[4] = dataByte[1];
                //sendData[5] = dataByte[0];

            }

            sendData = buildCheckData(sendData, sendData.Length - 2); 
            return sendData;
        }
        

    }
    public  enum InfoType
    {
        Debug=1,
        Info=2,
        Error=3
    }
}