ACServerManager.cs 13.0 KB
using OnlineStore.Common;
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading; 

namespace OnlineStore.DeviceLibrary
{ 
    /// <summary>
    /// 外部调用的接口放在此文件中
    /// </summary>
    public partial class ACServerManager
    {
        private static bool IsShowMsg = false;
        private static int SleepMSendons = 100;
        public static bool OpenPort(string portName)
        {
            if (serialBeanMap.ContainsKey(portName))
            {
                return true ;
            }
            AcSerialBean bean = new AcSerialBean(portName, 9600, Parity.Even, 8, StopBits.One);
            bool result = bean.openPort();
            if (!result)
            {
                LogUtil.info("打开串口【" + portName + "】失败");
                return false;
            }
            LogUtil.info("打开串口【" + portName + "】成功");
            //bean.DataReceived += DataReceived;

            if (serialBeanMap.ContainsKey(portName))
            {
                serialBeanMap.Remove(portName);
            }
            serialBeanMap.Add(portName, bean);

            return true;
        }
        public static void ColsePort(string portName)
        {
            AcSerialBean bean = GetSerialBean(portName);
            if (bean == null)
            {
                LogUtil.info("串口【" + portName + "】未打开,不需要关闭");
                return;
            }
            //清理缓存
            bean.clearInBuffer();
            bean.clearOutBuffer();
            bean.closePort();

            if (serialBeanMap.ContainsKey(portName))
            {
                serialBeanMap.Remove(portName);
            }
        }

        /// <summary>
        /// 是否成功打开伺服
        /// </summary> 
        public static bool ServerOnStatus(string portName, int slvAddr)
        {
            if (!serialBeanMap.ContainsKey(portName))
            {
                return false ;
            }
            PreReadCoilAddr = ACCMDManager.ServerOn_Addr;
            byte[] dataArray = ACCMDManager.GetWriteData(slvAddr, ACCMDManager.CMD_ReadCoil, PreReadCoilAddr, "0000", 1);
            //SendData(portName,dataArray); 
            byte[] reviceData = SendCommand(portName, dataArray, 100, 6);
            int result= GetCoilData(portName, reviceData, PreReadCoilAddr);
            //TODO
            return result>=1;
        }
        /// <summary>
        /// 是否原点返回完成
        /// </summary> 
        public static bool IsHomeMoveEnd(string portName, int slvAddr)
        {
            int status = GetHomeEndStatus(portName, slvAddr);
            if (status >= 1)
            {
                return true;
            } return false;
        }
        public static void InitSlvAddr(string portName, int slvAddr)
        {
            InitSlvAddr(portName, slvAddr, 100, 30, 30 );
            //InitSlvAddr(portName, slvAddr, 100, 30, 30, 100, 50, 30);
        }
        //把数字转换为四位的字符串
        public static string SpeedToStr(int speed,int length)
        {
            string str = String.Format("{0:X}", speed);
            return str.PadLeft(length, '0');
        }
        public static void InitSlvAddr(string portName, int slvAddr,int targetSpeed,int addSpeed,int delSpeed )
        //public static void InitSlvAddr(string portName, int slvAddr,int targetSpeed,int addSpeed,int delSpeed,int homeHighSpeed,int homeLowSpeed,int homeAddSpeed)
        {
            LogUtil.info("开始初始化伺服【" + portName + "】【" + slvAddr + "】");
            //写入block
            int sleep = 20;
            string slvAddrStr = string.Format(strFromat, slvAddr);
            //block0=原点返回,正方向
            string str0 = slvAddrStr + "104800 000408 00000420 00000000 ffff";
            SendStrAndSleep(portName, str0, sleep); 
            //block1=原点返回,反方向
            string str1 = slvAddrStr + "104804 000408 04000420 00000000 ffff";
            SendStrAndSleep(portName, str1, sleep); 
            //block2=绝对位置运动
            string str2 = slvAddrStr + "104808 000408 10000211EC78FFFF ffff";
            SendStrAndSleep(portName, str2, sleep);
            //block3=相对位置运动
            string str3 = slvAddrStr + "10480C 000408 10000111EC78FFFF ffff";
            SendStrAndSleep(portName, str3, sleep);
            //block4=正方向匀速运动
            string str4 = slvAddrStr + "104810 000408 10000311 00000000 ffff";
            SendStrAndSleep(portName, str4, sleep);
            //block5=反方向匀速运动
            string str5 = slvAddrStr + "104814 000408 14000311 00000000 ffff";
            SendStrAndSleep(portName, str5, sleep);
            //block6=减速停止
            string str6 = slvAddrStr + "104818 000408 00000500 00000000 ffff";
            SendStrAndSleep(portName, str6, sleep);

            //block7=紧急停止 
            string str7 = slvAddrStr + "10481c 000408 00000510 00000000 ffff";
            SendStrAndSleep(portName, str7, sleep);

            //0106460001009D12
            //速度 V1 =100
            string v1 = slvAddrStr + "064601  " + SpeedToStr(targetSpeed, 4) + "  ffff";
            SendStrAndSleep(portName, v1, sleep);
            //加速度 A1 =30
            string a1 = slvAddrStr + "064611  " + SpeedToStr(addSpeed, 4) + "  ffff";
            SendStrAndSleep(portName, a1, sleep);
            //减速度 D1=30
            string d1 = slvAddrStr + "064621   " + SpeedToStr(delSpeed, 4) + "  ffff";
            SendStrAndSleep(portName, d1, sleep);

            ////原点返回高速 homeHighSpeed=100
            //SendStrAndSleep(portName, slvAddrStr + "06 4637 " + SpeedToStr(homeHighSpeed, 4) + " ffff", sleep);
            ////原点返回抵速 homeLowSpeed=50
            //SendStrAndSleep(portName, slvAddrStr + "06 4638 " + SpeedToStr(homeLowSpeed, 4) + " ffff", sleep);
            ////原点返回加速度=30
            //SendStrAndSleep(portName, slvAddrStr + "06 4639 " + SpeedToStr(homeAddSpeed, 4) + " ffff", sleep);
            UpdateEEPROM(portName, slvAddr);
        }
        public static void UpdateEEPROM(string portName, int slvAddr)
        {
            string addr = ACCMDManager.EEPROM_Param_Addr;
            string data = "6173"; 
            int length = 2;
            byte[] dataArray = ACCMDManager.GetWriteData(slvAddr, ACCMDManager.CMD_WriteRegisters, addr, data, length);
            SendData(portName, dataArray);
        }
        public static void ServoOn(string portName, int slvAddr)
        {
            string addr = ACCMDManager.ServerOn_Addr;
            string data = "FF00";
            //byte cmd = 0x05;

            int length = 2;
            byte[] dataArray = ACCMDManager.GetWriteData(slvAddr, ACCMDManager.CMD_WriteCoil, addr, data, length);
            SendData(portName, dataArray);
        }

        public static void ServoOff(string portName, int slvAddr)
        {
            string addr = ACCMDManager.ServerOn_Addr;
            string data = "0000";
            //byte cmd = 0x05; 
            int length = 2;
            byte[] dataArray = ACCMDManager.GetWriteData(slvAddr, ACCMDManager.CMD_WriteCoil, addr, data, length);
            SendData(portName, dataArray);
        }

        public static void RelMove(string portName, int slvAddr, int position,int targetSpeed)
        {  
            //先更新速度 
            string slvAddrStr = string.Format(strFromat, slvAddr); 
            string v1 = slvAddrStr + "064601  " + SpeedToStr(targetSpeed, 4) + "  ffff";
            SendStrAndSleep(portName, v1,SleepMSendons);
             
            RelMove(portName, slvAddr, position);
        }
        public static void RelMove(string portName, int slvAddr, int position)
        {
            //int position = Convert.ToInt32(txtPosition.Text);
            byte[] positionData = SerialBean.StringToByte(position.ToString("X8"));
            byte[] data = SerialBean.StringToByte("0110480C 000408 10000111EC78FFFF ffff");
            data[0] = (byte)slvAddr;
            data[data.Length - 1] = 0x00;
            data[data.Length - 2] = 0x00;

            if (positionData.Length == 4)
            {
                data[11] = positionData[2];
                data[12] = positionData[3];
                data[13] = positionData[0];
                data[14] = positionData[1];
            }
            else if (positionData.Length == 3)
            {
                data[11] = positionData[1];
                data[12] = positionData[2];
                data[13] = 0x00;
                data[14] = positionData[0];
            }
            else if (positionData.Length == 2)
            {
                data[11] = positionData[0];
                data[12] = positionData[1];
                data[13] = 0x00;
                data[14] = 0x00;
            }
            else if (positionData.Length == 1)
            {
                data[11] = 0x00;
                data[12] = positionData[0];
                data[13] = 0x00;
                data[14] = 0x00;
            }
            data = ACCMDManager.buildCheckData(data, data.Length - 2);
            SendData(portName, data);
            System.Threading.Thread.Sleep(SleepMSendons);
            //运动
            data = ACCMDManager.GetWriteData(slvAddr, 06, ACCMDManager.BlockNo, ACCMDManager.Block_RelMove, 2);
            SendData(portName, data);

            Thread.Sleep(SleepMSendons); 
            OpenAndCloseSTB(portName, slvAddr);
        }

        public static void HomeMove(string portName, int slvAddr, int speed)
        { 
            //默认负方向原点返回
            byte[] data = ACCMDManager.GetWriteData(slvAddr, ACCMDManager.CMD_WriteRegisters, ACCMDManager.BlockNo, ACCMDManager.Block_HomeMove1, 2);
            SendData(portName, data); 
            Thread.Sleep(SleepMSendons);
            OpenAndCloseSTB(portName, slvAddr);
        }

        public static void SpeedMove(string portName, int slvAddr, int speed)
        {
            byte[] data = ACCMDManager.GetWriteData(slvAddr, ACCMDManager.CMD_WriteRegisters, "4601", string.Format("{0:X2}", Math.Abs(speed)), 2);
            SendData(portName, data);
            Thread.Sleep(SleepMSendons);
            if (speed > 0)
            {
                data = ACCMDManager.GetWriteData(slvAddr, ACCMDManager.CMD_WriteRegisters, ACCMDManager.BlockNo, ACCMDManager.Block_VolMove0, 2);
                SendData(portName, data);
            }
            else
            {
                data = ACCMDManager.GetWriteData(slvAddr, ACCMDManager.CMD_WriteRegisters, ACCMDManager.BlockNo, ACCMDManager.Block_VolMove1, 2);
                SendData(portName, data);
            }
            Thread.Sleep(SleepMSendons);
            OpenAndCloseSTB(portName, slvAddr);
        }
        public static void AbsMove(string portName, int slvAddr, int targetPosition, int targetSpeed)
        {
            //先更新速度 
            string slvAddrStr = string.Format(strFromat, slvAddr);
            //0106460001009D12
            //速度 V1 =100
            string v1 = slvAddrStr + "064601  " + SpeedToStr(targetSpeed, 4) + "  ffff";
            SendStrAndSleep(portName, v1,SleepMSendons);

            //绝对运动
            AbsMove(portName, slvAddr, targetPosition);
        }
        public static void AbsMove(string portName, int slvAddr, int position)
        {
            //int position = Convert.ToInt32(txtPosition.Text, 10);
            byte[] positionData = SerialBean.StringToByte(position.ToString("X8"));
            byte[] data = SerialBean.StringToByte("01104808 000408 10000211 EC78FFFF ffff");
            data[0] = (byte)slvAddr;
            data[data.Length - 1] = 0x00;
            data[data.Length - 2] = 0x00;

            if (positionData.Length == 4)
            {
                data[11] = positionData[2];
                data[12] = positionData[3];
                data[13] = positionData[0];
                data[14] = positionData[1];
            }
            else if (positionData.Length == 3)
            {
                data[11] = positionData[1];
                data[12] = positionData[2];
                data[13] = 0x00;
                data[14] = positionData[0];
            }
            else if (positionData.Length == 2)
            {
                data[11] = positionData[0];
                data[12] = positionData[1];
                data[13] = 0x00;
                data[14] = 0x00;
            }
            else if (positionData.Length == 1)
            {
                data[11] = 0x00;
                data[12] = positionData[0];
                data[13] = 0x00;
                data[14] = 0x00;
            }
            data = ACCMDManager.buildCheckData(data, data.Length - 2);
            SendData(portName, data);
            Thread.Sleep(SleepMSendons);
            data = ACCMDManager.GetWriteData(slvAddr, ACCMDManager.CMD_WriteRegisters, ACCMDManager.BlockNo, ACCMDManager.Block_AbsMove, 2);
            SendData(portName, data);
            Thread.Sleep(SleepMSendons);
            OpenAndCloseSTB(portName, slvAddr);
        }
    }
}