ACCMDManager.cs 8.1 KB
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ACServoDriveTest
{
    public class ACCMDManager
    {
        public static string ServerOn_Addr = "0060";
        public static string STB_Addr = "0120"; 
        public static string Stop_Addr = "0124"; 
        public static string SDStop_Addr = "0123";
        public static string Clear_Alarm_Addr = "0061";
        /// <summary>
        /// 目标位置=600B
        /// </summary>
        public static string TargetPostion = "600B";
        /// <summary>
        /// 实际位置=600F
        /// </summary>
        public static string ActualPosition = "600F";
         
        /// <summary>
        /// BUSY状态=0140
        public static string BUSYStatus = "0140";
        /// <summary>
        /// HOME-CMP=0141
        /// </summary>
        public static string HOME_CMP_Status = "0141";
        /// <summary>
        /// 报警状态=00A1
        /// </summary>
        public static string Alarm_Status = "00A1";
        /// <summary>
        /// 指定BlockNo=4414
        /// </summary>
        public static string BlockNo = "4414";
        /// <summary>
        /// 读线圈01
        /// </summary>
        public static byte CMD_ReadCoil= 0x01;
        /// <summary>
        /// 写线圈 05
        /// </summary>
        public static byte CMD_WriteCoil = 0x05;
        /// <summary>
        /// 读寄存器03
        /// </summary>
        public static byte CMD_ReadRegisters = 0x03;
        /// <summary>
        /// 写寄存器06
        /// </summary>
        public static byte CMD_WriteRegisters = 0x06;
        /// <summary>
        /// 写多个线圈 0f
        /// </summary>
        public static byte CMD_WriteMCoil = 0x0F;
        /// <summary>
        /// 写多个寄存器10
        /// </summary>
        public static byte CMD_WriteMRegisters = 0x10;

        public   static byte[] buildCheckData(byte[] sendData, int length)
        {
            ushort pChecksum = 0;
            SerialBean.CalculateCRC(sendData, length, out pChecksum);
            string checkStr = Convert.ToString(pChecksum, 16);
            byte[] checkByte = SerialBean.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;
        }

        public 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 = SerialBean.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 = SerialBean.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 = SerialBean.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 = SerialBean.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 = SerialBean.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 = SerialBean.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 = SerialBean.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 = SerialBean.StringToByte(dataValue);
            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;
        }
        

    }
}