1310 lines
		
	
	
		
			52 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			1310 lines
		
	
	
		
			52 KiB
		
	
	
	
		
			C#
		
	
	
	
| 
								 | 
							
								using log4net;
							 | 
						|||
| 
								 | 
							
								using log4net.Repository.Hierarchy;
							 | 
						|||
| 
								 | 
							
								using NetTaste;
							 | 
						|||
| 
								 | 
							
								using Prism.Events;
							 | 
						|||
| 
								 | 
							
								using Prism.Ioc;
							 | 
						|||
| 
								 | 
							
								using SqlSugar;
							 | 
						|||
| 
								 | 
							
								using System;
							 | 
						|||
| 
								 | 
							
								using System.Collections.Generic;
							 | 
						|||
| 
								 | 
							
								using System.ComponentModel.Design;
							 | 
						|||
| 
								 | 
							
								using System.Configuration;
							 | 
						|||
| 
								 | 
							
								using System.IO.Ports;
							 | 
						|||
| 
								 | 
							
								using System.Linq;
							 | 
						|||
| 
								 | 
							
								using System.Reflection.Metadata;
							 | 
						|||
| 
								 | 
							
								using System.Speech.Synthesis;
							 | 
						|||
| 
								 | 
							
								using System.Text;
							 | 
						|||
| 
								 | 
							
								using System.Threading.Channels;
							 | 
						|||
| 
								 | 
							
								using System.Threading.Tasks;
							 | 
						|||
| 
								 | 
							
								using System.Timers;
							 | 
						|||
| 
								 | 
							
								using System.Windows;
							 | 
						|||
| 
								 | 
							
								using System.Windows.Markup;
							 | 
						|||
| 
								 | 
							
								using System.Windows.Media.Animation;
							 | 
						|||
| 
								 | 
							
								using Unity;
							 | 
						|||
| 
								 | 
							
								using DM_Weight.msg;
							 | 
						|||
| 
								 | 
							
								using DM_Weight.Views;
							 | 
						|||
| 
								 | 
							
								using System.Reflection;
							 | 
						|||
| 
								 | 
							
								using System.Threading;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								namespace DM_Weight.Port
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
								    public class PortUtil
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        private readonly ILog logger = LogManager.GetLogger(typeof(PortUtil));
							 | 
						|||
| 
								 | 
							
								        // 抽屉串口
							 | 
						|||
| 
								 | 
							
								        public SerialPort drawerSerial;
							 | 
						|||
| 
								 | 
							
								        // can总线串口
							 | 
						|||
| 
								 | 
							
								        public SerialPort canBusSerial;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        // 条码枪串口
							 | 
						|||
| 
								 | 
							
								        public SerialPort scanCodeSerial;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        // 抽屉串口协议232 | 485
							 | 
						|||
| 
								 | 
							
								        private int _drawerProtocol = Convert.ToInt32(ConfigurationManager.AppSettings["DrawerProtocol"]);
							 | 
						|||
| 
								 | 
							
								        // can总线耗材板地址
							 | 
						|||
| 
								 | 
							
								        private int _doorAddr = Convert.ToInt32(ConfigurationManager.AppSettings["DoorAddr"]);
							 | 
						|||
| 
								 | 
							
								        // 储物箱地址
							 | 
						|||
| 
								 | 
							
								        private int _storageBoxAddr = Convert.ToInt32(ConfigurationManager.AppSettings["StorageBoxAddr"]);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        // can总线串口是否存在
							 | 
						|||
| 
								 | 
							
								        public bool _canBusExsit = Convert.ToBoolean(ConfigurationManager.AppSettings["CanBusExsit"]);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        // 当前操作的抽屉号
							 | 
						|||
| 
								 | 
							
								        public int DrawerNo { get; set; }
							 | 
						|||
| 
								 | 
							
								        // 当前操作的库位号列表
							 | 
						|||
| 
								 | 
							
								        public int[] ColNos { get; set; } = new int[] { };
							 | 
						|||
| 
								 | 
							
								        // 当前操作的库位号列表
							 | 
						|||
| 
								 | 
							
								        public int[] Stocks { get; set; } = new int[] { };
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        // 当前操作的窗口
							 | 
						|||
| 
								 | 
							
								        public string WindowName { get; set; }
							 | 
						|||
| 
								 | 
							
								        // 取药操作的窗口名【处方取药、抽屉取药、自选取药、调拨出库】
							 | 
						|||
| 
								 | 
							
								        private string[] TakeNames = new string[] { "DrawerTakeDrugWindow", "OrderTakeDrugWindow", "SelfTakeDrugWindow", "InvoiceTakeDrugWindow" };
							 | 
						|||
| 
								 | 
							
								        // 加药操作的窗口名【自选加药、抽屉加药、还药】
							 | 
						|||
| 
								 | 
							
								        private string[] AddNames = new string[] { "SelfAddWindow", "ReturnDrugWindow", "ReturnDrug1Window", "DrawerAddDrugWindow" };
							 | 
						|||
| 
								 | 
							
								        // 盘点操作的窗口名【盘点】
							 | 
						|||
| 
								 | 
							
								        private string[] CheckNames = new string[] { "CheckStockWindow" };
							 | 
						|||
| 
								 | 
							
								        // 归还空瓶操作的窗口名【盘点】
							 | 
						|||
| 
								 | 
							
								        private string[] ReturnEmptyNames = new string[] { "ReturnEmptyWindow" };
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public int BoardType { get; set; } = 1;
							 | 
						|||
| 
								 | 
							
								        public int DrawerType { get; set; } = 1;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        private int[] BeforeQuantity { get; set; } = new int[] { };
							 | 
						|||
| 
								 | 
							
								        private int[] AfterQuantity { get; set; } = new int[] { };
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        // 整体流程状态
							 | 
						|||
| 
								 | 
							
								        private int statue { get; set; } = 0;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        // 是否正在操作中
							 | 
						|||
| 
								 | 
							
								        public bool Operate { get; set; }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public DateTime dateTime { get; set; } = DateTime.Now;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public async void ResetData()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            logger.Info($"重新设置串口数据状态【{statue}】,抽屉【{DrawerNo}】");
							 | 
						|||
| 
								 | 
							
								            if (!"HomeWindow".Equals(WindowName) && statue == 1)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                if (BoardType == 2)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    // 灭灯
							 | 
						|||
| 
								 | 
							
								                    AllLightOff();
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                if (BoardType == 3)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    // 失能
							 | 
						|||
| 
								 | 
							
								                    await BoxLockLightOff();
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                if (BoardType == 4)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    // 失能
							 | 
						|||
| 
								 | 
							
								                    CloseStorage();
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                if (BoardType == 6)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    // 失能
							 | 
						|||
| 
								 | 
							
								                    await BoxLockLightOff2();
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                if(BoardType==5)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    await WriteQuantityArray();
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            Operate = false;
							 | 
						|||
| 
								 | 
							
								            dateTime = DateTime.Now;
							 | 
						|||
| 
								 | 
							
								            statue = 0;
							 | 
						|||
| 
								 | 
							
								            BeforeQuantity = new int[9];
							 | 
						|||
| 
								 | 
							
								            AfterQuantity = new int[9];
							 | 
						|||
| 
								 | 
							
								            BoardType = 1;
							 | 
						|||
| 
								 | 
							
								            DrawerType = 1;
							 | 
						|||
| 
								 | 
							
								            WindowName = "";
							 | 
						|||
| 
								 | 
							
								            DrawerNo = 0;
							 | 
						|||
| 
								 | 
							
								            ColNos = new int[] { };
							 | 
						|||
| 
								 | 
							
								            Stocks = new int[] { };
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public async void Start()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            logger.Info($"进行抽屉操作抽屉号【{DrawerNo}】类型【{BoardType}】库位【{string.Join(",", ColNos)}】窗口【{WindowName}】");
							 | 
						|||
| 
								 | 
							
								            Operate = true;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            try
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                // 储物箱直接开
							 | 
						|||
| 
								 | 
							
								                if (BoardType == 4)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    byte[] result = await OpenStorage();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                    int[] r = result.Select(it => Convert.ToInt32(it)).ToArray();
							 | 
						|||
| 
								 | 
							
								                    if (r[4] != 0)
							 | 
						|||
| 
								 | 
							
								                    {
							 | 
						|||
| 
								 | 
							
								                        logger.Info($"储物箱使能成功");
							 | 
						|||
| 
								 | 
							
								                        // 查询锁状态
							 | 
						|||
| 
								 | 
							
								                        GetBackDoorState();
							 | 
						|||
| 
								 | 
							
								                    }
							 | 
						|||
| 
								 | 
							
								                    else
							 | 
						|||
| 
								 | 
							
								                    {
							 | 
						|||
| 
								 | 
							
								                        string _WindowName = WindowName;
							 | 
						|||
| 
								 | 
							
								                        // 重新初始化数据
							 | 
						|||
| 
								 | 
							
								                        ResetData();
							 | 
						|||
| 
								 | 
							
								                        // 指令发送错误,未打开
							 | 
						|||
| 
								 | 
							
								                        // 返回消息  抽屉打开失败
							 | 
						|||
| 
								 | 
							
								                        _eventAggregator.GetEvent<PortUtilEvent>().Publish(new util.DeviceMsg()
							 | 
						|||
| 
								 | 
							
								                        {
							 | 
						|||
| 
								 | 
							
								                            EventType = util.EventType.OPENERROR,
							 | 
						|||
| 
								 | 
							
								                            WindowName = _WindowName,
							 | 
						|||
| 
								 | 
							
								                            Message = "储物箱使能失败"
							 | 
						|||
| 
								 | 
							
								                        }); 
							 | 
						|||
| 
								 | 
							
								                        logger.Info($"储物箱使能失败r:"+string.Join("",r));
							 | 
						|||
| 
								 | 
							
								                    }
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                else
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    // 外置抽屉
							 | 
						|||
| 
								 | 
							
								                    if (DrawerType == 3)
							 | 
						|||
| 
								 | 
							
								                    {
							 | 
						|||
| 
								 | 
							
								                        if (BoardType == 2)
							 | 
						|||
| 
								 | 
							
								                        {
							 | 
						|||
| 
								 | 
							
								                            byte[] buffer = await OpenRecover();
							 | 
						|||
| 
								 | 
							
								                            int[] r = buffer.Select(it => Convert.ToInt32(it)).ToArray();
							 | 
						|||
| 
								 | 
							
								                            if ((ColNos[0] > 3 && r[4] == 1) || (ColNos[0] < 4 && r[3] == 1))
							 | 
						|||
| 
								 | 
							
								                            {
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                                // 告诉前台打开成功
							 | 
						|||
| 
								 | 
							
								                                _eventAggregator.GetEvent<PortUtilEvent>().Publish(new util.DeviceMsg()
							 | 
						|||
| 
								 | 
							
								                                {
							 | 
						|||
| 
								 | 
							
								                                    EventType = util.EventType.DRAWEROPEN,
							 | 
						|||
| 
								 | 
							
								                                    WindowName = WindowName,
							 | 
						|||
| 
								 | 
							
								                                });
							 | 
						|||
| 
								 | 
							
								                                logger.Info($"回收箱打开成功");
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                                // 查询是否关闭状态
							 | 
						|||
| 
								 | 
							
								                                GeRecoverStatus();
							 | 
						|||
| 
								 | 
							
								                            }
							 | 
						|||
| 
								 | 
							
								                            else
							 | 
						|||
| 
								 | 
							
								                            {
							 | 
						|||
| 
								 | 
							
								                                string _WindowName = WindowName;
							 | 
						|||
| 
								 | 
							
								                                // 重新初始化数据
							 | 
						|||
| 
								 | 
							
								                                ResetData();
							 | 
						|||
| 
								 | 
							
								                                // 返回消息开启失败
							 | 
						|||
| 
								 | 
							
								                                // 返回消息  抽屉打开失败
							 | 
						|||
| 
								 | 
							
								                                _eventAggregator.GetEvent<PortUtilEvent>().Publish(new util.DeviceMsg()
							 | 
						|||
| 
								 | 
							
								                                {
							 | 
						|||
| 
								 | 
							
								                                    EventType = util.EventType.OPENERROR,
							 | 
						|||
| 
								 | 
							
								                                    WindowName = _WindowName,
							 | 
						|||
| 
								 | 
							
								                                    Message = "回收箱打开失败"
							 | 
						|||
| 
								 | 
							
								                                });
							 | 
						|||
| 
								 | 
							
								                                logger.Info($"回收箱打开失败");
							 | 
						|||
| 
								 | 
							
								                            }
							 | 
						|||
| 
								 | 
							
								                        }
							 | 
						|||
| 
								 | 
							
								                    }
							 | 
						|||
| 
								 | 
							
								                    // 内置抽屉
							 | 
						|||
| 
								 | 
							
								                    else
							 | 
						|||
| 
								 | 
							
								                    {
							 | 
						|||
| 
								 | 
							
								                        if (BoardType == 2)
							 | 
						|||
| 
								 | 
							
								                        {
							 | 
						|||
| 
								 | 
							
								                            byte[] quantity = await CheckQuantityByDrawer();
							 | 
						|||
| 
								 | 
							
								                            BeforeQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray();
							 | 
						|||
| 
								 | 
							
								                            logger.Info($"BeforeQuantity{string.Join(",", BeforeQuantity)}");
							 | 
						|||
| 
								 | 
							
								                        }
							 | 
						|||
| 
								 | 
							
								                        if (BoardType == 6)
							 | 
						|||
| 
								 | 
							
								                        {
							 | 
						|||
| 
								 | 
							
								                            int[] quantity = await CheckQuantityByAddr2();
							 | 
						|||
| 
								 | 
							
								                            BeforeQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray();
							 | 
						|||
| 
								 | 
							
								                            logger.Info($"BeforeQuantity{string.Join(",", BeforeQuantity)}");
							 | 
						|||
| 
								 | 
							
								                        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                        byte[] buffer = await OpenDrawer();
							 | 
						|||
| 
								 | 
							
								                        int[] r = buffer.Select(it => Convert.ToInt32(it)).ToArray();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                        logger.Info($"OpenDrawer{string.Join(",", r)}");
							 | 
						|||
| 
								 | 
							
								                        if (DrawerState(r))
							 | 
						|||
| 
								 | 
							
								                        {
							 | 
						|||
| 
								 | 
							
								                            statue = 1;
							 | 
						|||
| 
								 | 
							
								                            // 是不是单支抽屉
							 | 
						|||
| 
								 | 
							
								                            if (BoardType == 2)
							 | 
						|||
| 
								 | 
							
								                            {
							 | 
						|||
| 
								 | 
							
								                                // 取药
							 | 
						|||
| 
								 | 
							
								                                if (Array.IndexOf(TakeNames, WindowName) > -1)
							 | 
						|||
| 
								 | 
							
								                                {
							 | 
						|||
| 
								 | 
							
								                                    // 有药位置亮灯
							 | 
						|||
| 
								 | 
							
								                                    await HasLightOnByCol();
							 | 
						|||
| 
								 | 
							
								                                }
							 | 
						|||
| 
								 | 
							
								                                // 加药
							 | 
						|||
| 
								 | 
							
								                                if (Array.IndexOf(AddNames, WindowName) > -1)
							 | 
						|||
| 
								 | 
							
								                                {
							 | 
						|||
| 
								 | 
							
								                                    // 无药位置亮灯
							 | 
						|||
| 
								 | 
							
								                                    await NoLightOnByCol();
							 | 
						|||
| 
								 | 
							
								                                }
							 | 
						|||
| 
								 | 
							
								                                // 盘点
							 | 
						|||
| 
								 | 
							
								                                if (Array.IndexOf(CheckNames, WindowName) > -1)
							 | 
						|||
| 
								 | 
							
								                                {
							 | 
						|||
| 
								 | 
							
								                                    // 不亮灯
							 | 
						|||
| 
								 | 
							
								                                }
							 | 
						|||
| 
								 | 
							
								                                // 空瓶
							 | 
						|||
| 
								 | 
							
								                                if (Array.IndexOf(ReturnEmptyNames, WindowName) > -1)
							 | 
						|||
| 
								 | 
							
								                                {
							 | 
						|||
| 
								 | 
							
								                                    // 无药位置亮灯
							 | 
						|||
| 
								 | 
							
								                                    await NoLightOnByCol();
							 | 
						|||
| 
								 | 
							
								                                }
							 | 
						|||
| 
								 | 
							
								                            }
							 | 
						|||
| 
								 | 
							
								                            // 药盒
							 | 
						|||
| 
								 | 
							
								                            if (BoardType == 3)
							 | 
						|||
| 
								 | 
							
								                            {
							 | 
						|||
| 
								 | 
							
								                                // 药盒指示灯使能
							 | 
						|||
| 
								 | 
							
								                                await BoxLockLightOn();
							 | 
						|||
| 
								 | 
							
								                            }
							 | 
						|||
| 
								 | 
							
								                            if (BoardType == 6)
							 | 
						|||
| 
								 | 
							
								                            {
							 | 
						|||
| 
								 | 
							
								                                // 药盒指示灯使能
							 | 
						|||
| 
								 | 
							
								                                await BoxLockLightOn2();
							 | 
						|||
| 
								 | 
							
								                            }
							 | 
						|||
| 
								 | 
							
								                            // 返回消息  抽屉已经打开
							 | 
						|||
| 
								 | 
							
								                            _eventAggregator.GetEvent<PortUtilEvent>().Publish(new util.DeviceMsg()
							 | 
						|||
| 
								 | 
							
								                            {
							 | 
						|||
| 
								 | 
							
								                                EventType = util.EventType.DRAWEROPEN,
							 | 
						|||
| 
								 | 
							
								                                WindowName = WindowName,
							 | 
						|||
| 
								 | 
							
								                            });
							 | 
						|||
| 
								 | 
							
								                            logger.Info($"抽屉【{DrawerNo}】打开成功");
							 | 
						|||
| 
								 | 
							
								                            // 查询抽屉状态
							 | 
						|||
| 
								 | 
							
								                            await Task.Delay(200);
							 | 
						|||
| 
								 | 
							
								                            GetDrawerStatus();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                        }
							 | 
						|||
| 
								 | 
							
								                        else
							 | 
						|||
| 
								 | 
							
								                        {
							 | 
						|||
| 
								 | 
							
								                            string _WindowName = WindowName;
							 | 
						|||
| 
								 | 
							
								                            // 重新初始化数据
							 | 
						|||
| 
								 | 
							
								                            ResetData();
							 | 
						|||
| 
								 | 
							
								                            // 返回消息  抽屉打开失败
							 | 
						|||
| 
								 | 
							
								                            _eventAggregator.GetEvent<PortUtilEvent>().Publish(new util.DeviceMsg()
							 | 
						|||
| 
								 | 
							
								                            {
							 | 
						|||
| 
								 | 
							
								                                EventType = util.EventType.OPENERROR,
							 | 
						|||
| 
								 | 
							
								                                WindowName = _WindowName,
							 | 
						|||
| 
								 | 
							
								                                Message = $"抽屉【{DrawerNo}】打开失败"
							 | 
						|||
| 
								 | 
							
								                            });
							 | 
						|||
| 
								 | 
							
								                            logger.Info($"抽屉【{DrawerNo}】打开失败");
							 | 
						|||
| 
								 | 
							
								                        }
							 | 
						|||
| 
								 | 
							
								                    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            catch (Exception ex)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                string _WindowName = WindowName;
							 | 
						|||
| 
								 | 
							
								                statue = 1;
							 | 
						|||
| 
								 | 
							
								                // 重新初始化数据
							 | 
						|||
| 
								 | 
							
								                ResetData();
							 | 
						|||
| 
								 | 
							
								                // 返回消息  抽屉打开失败
							 | 
						|||
| 
								 | 
							
								                _eventAggregator.GetEvent<PortUtilEvent>().Publish(new util.DeviceMsg()
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    EventType = util.EventType.OPENERROR,
							 | 
						|||
| 
								 | 
							
								                    WindowName = _WindowName,
							 | 
						|||
| 
								 | 
							
								                    Message = $"操作异常{ex.Message}"
							 | 
						|||
| 
								 | 
							
								                });
							 | 
						|||
| 
								 | 
							
								                logger.Info(ex.Message);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public async void GetDrawerStatus()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            try
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                if (Operate)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    // 查询抽屉状态
							 | 
						|||
| 
								 | 
							
								                    byte[] buffer = await CheckDrawerStatus();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                    int[] r = buffer.Select(it => Convert.ToInt32(it)).ToArray();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                    logger.Info($"GetDrawerStatus{string.Join(",", r)}");
							 | 
						|||
| 
								 | 
							
								                    // 抽屉没有关闭
							 | 
						|||
| 
								 | 
							
								                    if (DrawerState(r))
							 | 
						|||
| 
								 | 
							
								                    {
							 | 
						|||
| 
								 | 
							
								                        if (BoardType == 2)
							 | 
						|||
| 
								 | 
							
								                        {
							 | 
						|||
| 
								 | 
							
								                            // 继续查询抽屉药品数量
							 | 
						|||
| 
								 | 
							
								                            // 查询抽屉药品数量
							 | 
						|||
| 
								 | 
							
								                            byte[] quantity = await CheckQuantityByDrawer();
							 | 
						|||
| 
								 | 
							
								                            AfterQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray();
							 | 
						|||
| 
								 | 
							
								                            logger.Info($"AfterQuantity{string.Join(",", AfterQuantity)}");
							 | 
						|||
| 
								 | 
							
								                            int[] Quantitys = new int[BeforeQuantity.Length];
							 | 
						|||
| 
								 | 
							
								                            for (int i = 0; i < BeforeQuantity.Length; i++)
							 | 
						|||
| 
								 | 
							
								                            {
							 | 
						|||
| 
								 | 
							
								                                // 取药
							 | 
						|||
| 
								 | 
							
								                                if (Array.IndexOf(TakeNames, WindowName) > -1)
							 | 
						|||
| 
								 | 
							
								                                {
							 | 
						|||
| 
								 | 
							
								                                    Quantitys[i] = BeforeQuantity[i] - AfterQuantity[i];
							 | 
						|||
| 
								 | 
							
								                                }
							 | 
						|||
| 
								 | 
							
								                                // 加药
							 | 
						|||
| 
								 | 
							
								                                if (Array.IndexOf(AddNames, WindowName) > -1)
							 | 
						|||
| 
								 | 
							
								                                {
							 | 
						|||
| 
								 | 
							
								                                    Quantitys[i] = AfterQuantity[i] - BeforeQuantity[i];
							 | 
						|||
| 
								 | 
							
								                                }
							 | 
						|||
| 
								 | 
							
								                                // 盘点
							 | 
						|||
| 
								 | 
							
								                                if (Array.IndexOf(CheckNames, WindowName) > -1)
							 | 
						|||
| 
								 | 
							
								                                {
							 | 
						|||
| 
								 | 
							
								                                    Quantitys[i] = AfterQuantity[i] - BeforeQuantity[i];
							 | 
						|||
| 
								 | 
							
								                                }
							 | 
						|||
| 
								 | 
							
								                                // 空瓶
							 | 
						|||
| 
								 | 
							
								                                if (Array.IndexOf(CheckNames, WindowName) > -1)
							 | 
						|||
| 
								 | 
							
								                                {
							 | 
						|||
| 
								 | 
							
								                                    Quantitys[i] = AfterQuantity[i] - BeforeQuantity[i];
							 | 
						|||
| 
								 | 
							
								                                }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                            }
							 | 
						|||
| 
								 | 
							
								                            // 告诉前台数据变化
							 | 
						|||
| 
								 | 
							
								                            _eventAggregator.GetEvent<PortUtilEvent>().Publish(new util.DeviceMsg()
							 | 
						|||
| 
								 | 
							
								                            {
							 | 
						|||
| 
								 | 
							
								                                EventType = util.EventType.UPDATEQUANTITY,
							 | 
						|||
| 
								 | 
							
								                                WindowName = WindowName,
							 | 
						|||
| 
								 | 
							
								                                Quantitys = Quantitys
							 | 
						|||
| 
								 | 
							
								                            });
							 | 
						|||
| 
								 | 
							
								                            logger.Info($"单支板数量变化【{string.Join(",", Quantitys)}】");
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                        }
							 | 
						|||
| 
								 | 
							
								                        if (BoardType == 6)
							 | 
						|||
| 
								 | 
							
								                        {
							 | 
						|||
| 
								 | 
							
								                            // 继续查询抽屉药品数量
							 | 
						|||
| 
								 | 
							
								                            // 查询抽屉药品数量
							 | 
						|||
| 
								 | 
							
								                            int[] quantity = await CheckQuantityByAddr2();
							 | 
						|||
| 
								 | 
							
								                            AfterQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray();
							 | 
						|||
| 
								 | 
							
								                            logger.Info($"AfterQuantity{string.Join(",", AfterQuantity)}");
							 | 
						|||
| 
								 | 
							
								                            int[] Quantitys = new int[BeforeQuantity.Length];
							 | 
						|||
| 
								 | 
							
								                            for (int i = 0; i < BeforeQuantity.Length; i++)
							 | 
						|||
| 
								 | 
							
								                            {
							 | 
						|||
| 
								 | 
							
								                                // 取药
							 | 
						|||
| 
								 | 
							
								                                if (Array.IndexOf(TakeNames, WindowName) > -1)
							 | 
						|||
| 
								 | 
							
								                                {
							 | 
						|||
| 
								 | 
							
								                                    Quantitys[i] = BeforeQuantity[i] - AfterQuantity[i];
							 | 
						|||
| 
								 | 
							
								                                }
							 | 
						|||
| 
								 | 
							
								                                // 加药
							 | 
						|||
| 
								 | 
							
								                                if (Array.IndexOf(AddNames, WindowName) > -1)
							 | 
						|||
| 
								 | 
							
								                                {
							 | 
						|||
| 
								 | 
							
								                                    Quantitys[i] = AfterQuantity[i] - BeforeQuantity[i];
							 | 
						|||
| 
								 | 
							
								                                }
							 | 
						|||
| 
								 | 
							
								                                // 盘点
							 | 
						|||
| 
								 | 
							
								                                if (Array.IndexOf(CheckNames, WindowName) > -1)
							 | 
						|||
| 
								 | 
							
								                                {
							 | 
						|||
| 
								 | 
							
								                                    Quantitys[i] = AfterQuantity[i] - BeforeQuantity[i];
							 | 
						|||
| 
								 | 
							
								                                }
							 | 
						|||
| 
								 | 
							
								                                // 空瓶
							 | 
						|||
| 
								 | 
							
								                                if (Array.IndexOf(CheckNames, WindowName) > -1)
							 | 
						|||
| 
								 | 
							
								                                {
							 | 
						|||
| 
								 | 
							
								                                    Quantitys[i] = AfterQuantity[i] - BeforeQuantity[i];
							 | 
						|||
| 
								 | 
							
								                                }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                            }
							 | 
						|||
| 
								 | 
							
								                            // 告诉前台数据变化
							 | 
						|||
| 
								 | 
							
								                            _eventAggregator.GetEvent<PortUtilEvent>().Publish(new util.DeviceMsg()
							 | 
						|||
| 
								 | 
							
								                            {
							 | 
						|||
| 
								 | 
							
								                                EventType = util.EventType.UPDATEQUANTITY,
							 | 
						|||
| 
								 | 
							
								                                WindowName = WindowName,
							 | 
						|||
| 
								 | 
							
								                                Quantitys = Quantitys
							 | 
						|||
| 
								 | 
							
								                            });
							 | 
						|||
| 
								 | 
							
								                            logger.Info($"单支板数量变化【{string.Join(",", Quantitys)}】");
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                        }
							 | 
						|||
| 
								 | 
							
								                        // 继续监听抽屉状态
							 | 
						|||
| 
								 | 
							
								                        await Task.Delay(200);
							 | 
						|||
| 
								 | 
							
								                        GetDrawerStatus();
							 | 
						|||
| 
								 | 
							
								                    }
							 | 
						|||
| 
								 | 
							
								                    else
							 | 
						|||
| 
								 | 
							
								                    {
							 | 
						|||
| 
								 | 
							
								                        statue = 2;
							 | 
						|||
| 
								 | 
							
								                        if (BoardType == 2)
							 | 
						|||
| 
								 | 
							
								                        {
							 | 
						|||
| 
								 | 
							
								                            // 关灯
							 | 
						|||
| 
								 | 
							
								                            AllLightOff();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                        }
							 | 
						|||
| 
								 | 
							
								                        // 药盒
							 | 
						|||
| 
								 | 
							
								                        if (BoardType == 3)
							 | 
						|||
| 
								 | 
							
								                        {
							 | 
						|||
| 
								 | 
							
								                            // 药盒指示灯失能
							 | 
						|||
| 
								 | 
							
								                            await BoxLockLightOff();
							 | 
						|||
| 
								 | 
							
								                        }
							 | 
						|||
| 
								 | 
							
								                        if (BoardType == 6)
							 | 
						|||
| 
								 | 
							
								                        {
							 | 
						|||
| 
								 | 
							
								                            // 药盒指示灯使能
							 | 
						|||
| 
								 | 
							
								                            await BoxLockLightOff2();
							 | 
						|||
| 
								 | 
							
								                        }
							 | 
						|||
| 
								 | 
							
								                        string _WindowName = WindowName;
							 | 
						|||
| 
								 | 
							
								                        logger.Info($"抽屉【{DrawerNo}】已关闭");
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                        // 重新初始化数据
							 | 
						|||
| 
								 | 
							
								                        ResetData();
							 | 
						|||
| 
								 | 
							
								                        // 返回消息  抽屉已经关闭
							 | 
						|||
| 
								 | 
							
								                        _eventAggregator.GetEvent<PortUtilEvent>().Publish(new util.DeviceMsg()
							 | 
						|||
| 
								 | 
							
								                        {
							 | 
						|||
| 
								 | 
							
								                            EventType = util.EventType.DRAWERCLOSE,
							 | 
						|||
| 
								 | 
							
								                            WindowName = _WindowName,
							 | 
						|||
| 
								 | 
							
								                        });
							 | 
						|||
| 
								 | 
							
								                    }
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            catch (Exception ex)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                string _WindowName = WindowName;
							 | 
						|||
| 
								 | 
							
								                // 重新初始化数据
							 | 
						|||
| 
								 | 
							
								                ResetData();
							 | 
						|||
| 
								 | 
							
								                _eventAggregator.GetEvent<PortUtilEvent>().Publish(new util.DeviceMsg()
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    EventType = util.EventType.OPENERROR,
							 | 
						|||
| 
								 | 
							
								                    WindowName = _WindowName,
							 | 
						|||
| 
								 | 
							
								                    Message = $"GetDrawerStatus异常:{ex.Message}"
							 | 
						|||
| 
								 | 
							
								                });
							 | 
						|||
| 
								 | 
							
								                logger.Info($"GetDrawerStatus异常:{ex.Message}");
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public async void GeRecoverStatus()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            if (Operate)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                byte[] buffer = await CheckRecoverStatus();
							 | 
						|||
| 
								 | 
							
								                int[] r = buffer.Select(it => Convert.ToInt32(it)).ToArray();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                logger.Info($"GeRecoverStatus{string.Join(",", r)}");
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                // 回收箱关闭成功
							 | 
						|||
| 
								 | 
							
								                if ((ColNos[0] > 3 && r[4] == 0) || (ColNos[0] < 4 && r[3] == 0))
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    logger.Info($"回收箱关闭");
							 | 
						|||
| 
								 | 
							
								                    // 查询数量
							 | 
						|||
| 
								 | 
							
								                    byte[] bytes = await CheckRecoverQuantity();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                    int[] r1 = bytes.Select(it => Convert.ToInt32(it)).ToArray();
							 | 
						|||
| 
								 | 
							
								                    // 返回消息库位关闭,放入空瓶数量
							 | 
						|||
| 
								 | 
							
								                    int[] quantitys = r1.Skip(3).Take(3).ToArray();
							 | 
						|||
| 
								 | 
							
								                    int index = ColNos[0] % 3 > 0 ? ColNos[0] % 3 - 1 : 2;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                    // 指定库位放入的药品数量
							 | 
						|||
| 
								 | 
							
								                    int InCount = quantitys[index];
							 | 
						|||
| 
								 | 
							
								                    string _WindowName = WindowName;
							 | 
						|||
| 
								 | 
							
								                    // 重新初始化数据
							 | 
						|||
| 
								 | 
							
								                    ResetData();
							 | 
						|||
| 
								 | 
							
								                    _eventAggregator.GetEvent<PortUtilEvent>().Publish(new util.DeviceMsg()
							 | 
						|||
| 
								 | 
							
								                    {
							 | 
						|||
| 
								 | 
							
								                        EventType = util.EventType.DRAWERCLOSE,
							 | 
						|||
| 
								 | 
							
								                        Quantitys = new int[] { InCount },
							 | 
						|||
| 
								 | 
							
								                        WindowName = _WindowName,
							 | 
						|||
| 
								 | 
							
								                    });
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                    logger.Info($"回收板数量变化【{string.Join(",", quantitys)}】");
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                else
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    // 查询是否关闭状态
							 | 
						|||
| 
								 | 
							
								                    await Task.Delay(200);
							 | 
						|||
| 
								 | 
							
								                    GeRecoverStatus();
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public async void GetBackDoorState()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            try
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                if (Operate)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    byte[] result = await BackDoorState();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                    int[] r = result.Select(it => Convert.ToInt32(it)).ToArray();
							 | 
						|||
| 
								 | 
							
								                    int[] lockStates = CheckStorageStatus(r.Skip(3).Take(2).ToArray());
							 | 
						|||
| 
								 | 
							
								                    int[] lightStates = CheckStorageStatus(r.Skip(5).Take(2).ToArray());
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                    // 锁处于关闭状态
							 | 
						|||
| 
								 | 
							
								                    if (lockStates[_storageBoxAddr - 1] == 0)
							 | 
						|||
| 
								 | 
							
								                    {
							 | 
						|||
| 
								 | 
							
								                        // 锁还未打开过
							 | 
						|||
| 
								 | 
							
								                        if (statue == 0)
							 | 
						|||
| 
								 | 
							
								                        {
							 | 
						|||
| 
								 | 
							
								                            // 指示灯不闪烁了,说明规定时间内没有开锁,需要给前台提示
							 | 
						|||
| 
								 | 
							
								                            if (lightStates[_storageBoxAddr - 1] == 0)
							 | 
						|||
| 
								 | 
							
								                            {
							 | 
						|||
| 
								 | 
							
								                                // 打开失败
							 | 
						|||
| 
								 | 
							
								                                logger.Info($"储物箱指示灯不闪烁,使能过期");
							 | 
						|||
| 
								 | 
							
								                            }
							 | 
						|||
| 
								 | 
							
								                            else
							 | 
						|||
| 
								 | 
							
								                            {
							 | 
						|||
| 
								 | 
							
								                                // 灯在闪烁继续监听状态
							 | 
						|||
| 
								 | 
							
								                                GetBackDoorState();
							 | 
						|||
| 
								 | 
							
								                            }
							 | 
						|||
| 
								 | 
							
								                        }
							 | 
						|||
| 
								 | 
							
								                        else if (statue == 1)
							 | 
						|||
| 
								 | 
							
								                        {
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                            // 锁是打开状态现在关闭了,说明操作完成了,告诉前台锁已关闭
							 | 
						|||
| 
								 | 
							
								                            statue = 2;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                            string _WindowName = WindowName;
							 | 
						|||
| 
								 | 
							
								                            // 重新初始化数据
							 | 
						|||
| 
								 | 
							
								                            ResetData();
							 | 
						|||
| 
								 | 
							
								                            _eventAggregator.GetEvent<PortUtilEvent>().Publish(new util.DeviceMsg()
							 | 
						|||
| 
								 | 
							
								                            {
							 | 
						|||
| 
								 | 
							
								                                EventType = util.EventType.DRAWERCLOSE,
							 | 
						|||
| 
								 | 
							
								                                WindowName = _WindowName,
							 | 
						|||
| 
								 | 
							
								                            });
							 | 
						|||
| 
								 | 
							
								                            logger.Info($"储物箱关闭");
							 | 
						|||
| 
								 | 
							
								                        }
							 | 
						|||
| 
								 | 
							
								                    }
							 | 
						|||
| 
								 | 
							
								                    // 锁处于打开状态
							 | 
						|||
| 
								 | 
							
								                    if (lockStates[_storageBoxAddr - 1] == 1)
							 | 
						|||
| 
								 | 
							
								                    {
							 | 
						|||
| 
								 | 
							
								                        // 锁还未打开过,说明打开成功了
							 | 
						|||
| 
								 | 
							
								                        if (statue == 0)
							 | 
						|||
| 
								 | 
							
								                        {
							 | 
						|||
| 
								 | 
							
								                            statue = 1;
							 | 
						|||
| 
								 | 
							
								                            // 告诉前台打开成功
							 | 
						|||
| 
								 | 
							
								                            _eventAggregator.GetEvent<PortUtilEvent>().Publish(new util.DeviceMsg()
							 | 
						|||
| 
								 | 
							
								                            {
							 | 
						|||
| 
								 | 
							
								                                EventType = util.EventType.DRAWEROPEN,
							 | 
						|||
| 
								 | 
							
								                                WindowName = WindowName,
							 | 
						|||
| 
								 | 
							
								                            });
							 | 
						|||
| 
								 | 
							
								                            logger.Info($"储物箱打开成功");
							 | 
						|||
| 
								 | 
							
								                        }
							 | 
						|||
| 
								 | 
							
								                        // 灯在闪烁继续监听状态
							 | 
						|||
| 
								 | 
							
								                        GetBackDoorState();
							 | 
						|||
| 
								 | 
							
								                    }
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            catch (Exception ex)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                logger.Info($"GetBackDoorState异常{ex.Message}");
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        private readonly IEventAggregator _eventAggregator;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public PortUtil(IEventAggregator eventAggregator)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            _eventAggregator = eventAggregator;
							 | 
						|||
| 
								 | 
							
								            try
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                string DrawerPortPath = ConfigurationManager.AppSettings["DrawerPortPath"];
							 | 
						|||
| 
								 | 
							
								                logger.Info($"打开抽屉串口【{DrawerPortPath}】");
							 | 
						|||
| 
								 | 
							
								                drawerSerial = new SerialPort(DrawerPortPath, 9600, Parity.None, 8);
							 | 
						|||
| 
								 | 
							
								                drawerSerial.Open();
							 | 
						|||
| 
								 | 
							
								                logger.Info($"抽屉串口打开结果【{drawerSerial.IsOpen}】");
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            catch (Exception e)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                logger.Error("抽屉串口打开错误" + e.Message);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            try
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                string ScanCodePortPath = ConfigurationManager.AppSettings["ScanCodePortPath"];
							 | 
						|||
| 
								 | 
							
								                logger.Info($"打开条码枪串口【{ScanCodePortPath}】");
							 | 
						|||
| 
								 | 
							
								                scanCodeSerial = new SerialPort(ScanCodePortPath, 9600, Parity.None, 8);
							 | 
						|||
| 
								 | 
							
								                scanCodeSerial.DataReceived += (object sender, System.IO.Ports.SerialDataReceivedEventArgs e) =>
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    string code = scanCodeSerial.ReadExisting();
							 | 
						|||
| 
								 | 
							
								                    _eventAggregator.GetEvent<PortUtilEvent>().Publish(new util.DeviceMsg()
							 | 
						|||
| 
								 | 
							
								                    {
							 | 
						|||
| 
								 | 
							
								                        EventType = util.EventType.CODESCAN,
							 | 
						|||
| 
								 | 
							
								                        Code = code,
							 | 
						|||
| 
								 | 
							
								                    });
							 | 
						|||
| 
								 | 
							
								                };
							 | 
						|||
| 
								 | 
							
								                scanCodeSerial.Open();
							 | 
						|||
| 
								 | 
							
								                logger.Info($"条码枪串口打开结果【{scanCodeSerial.IsOpen}】");
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            catch (Exception e)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                logger.Error("条码枪串口打开错误" + e.Message);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            if (_canBusExsit)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                try
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    string CanBusPortPath = ConfigurationManager.AppSettings["CanBusPortPath"];
							 | 
						|||
| 
								 | 
							
								                    logger.Info($"打开can总线串口【{CanBusPortPath}】");
							 | 
						|||
| 
								 | 
							
								                    canBusSerial = new SerialPort(CanBusPortPath, 57600, Parity.None, 8);
							 | 
						|||
| 
								 | 
							
								                    canBusSerial.Open();
							 | 
						|||
| 
								 | 
							
								                    logger.Info($"can总线串口打开结果【{canBusSerial.IsOpen}】");
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                catch (Exception e)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    logger.Error("can总线串口打开错误" + e.Message);
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        private byte[] GetBufferByPort(SerialPort serialPort, int length, int timeout)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            byte[] buffer = new byte[length];
							 | 
						|||
| 
								 | 
							
								            //try
							 | 
						|||
| 
								 | 
							
								            //{
							 | 
						|||
| 
								 | 
							
								                int _length = 0;
							 | 
						|||
| 
								 | 
							
								                DateTime start = DateTime.Now;
							 | 
						|||
| 
								 | 
							
								                DateTime end = DateTime.Now;
							 | 
						|||
| 
								 | 
							
								                while (_length != length && end.Subtract(start).TotalMilliseconds < timeout)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    _length = serialPort.BytesToRead;
							 | 
						|||
| 
								 | 
							
								                    end = DateTime.Now;
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                if (_length != length)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    throw new TimeoutException($"串口【{serialPort.PortName}】交互超时");
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                serialPort.Read(buffer, 0, length);
							 | 
						|||
| 
								 | 
							
								            //}
							 | 
						|||
| 
								 | 
							
								            //catch (Exception ex)
							 | 
						|||
| 
								 | 
							
								            //{
							 | 
						|||
| 
								 | 
							
								            //    logger.Error($"GetBufferByPort:{ex.Message}");
							 | 
						|||
| 
								 | 
							
								            //}
							 | 
						|||
| 
								 | 
							
								            return buffer;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        private Task<byte[]> GetBufferByPort(SerialPort serialPort, int length)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            return Task.Run(() => GetBufferByPort(serialPort, length, 3000));
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public static SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer();
							 | 
						|||
| 
								 | 
							
								        public void SpeakAsync(string textinfo)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            speechSynthesizer.SpeakAsync(textinfo);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        #region 抽屉串口操作
							 | 
						|||
| 
								 | 
							
								        // 打开抽屉
							 | 
						|||
| 
								 | 
							
								        public async Task<byte[]> OpenDrawer()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            drawerSerial.DiscardInBuffer();
							 | 
						|||
| 
								 | 
							
								            byte[] buffer = new byte[] { 0xaa, 0x41, (byte)DrawerNo, 0xee };
							 | 
						|||
| 
								 | 
							
								            if (_drawerProtocol == 485)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                if (DrawerNo > 8)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    buffer = new byte[] { 0xaa, 0x21, (byte)(DrawerNo - 8), 0xee };
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                else
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    buffer = new byte[] { 0xaa, 0x11, (byte)DrawerNo, 0xee };
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            logger.Info($"打开抽屉,串口数据:{Convert.ToHexString(buffer)}");
							 | 
						|||
| 
								 | 
							
								            drawerSerial.Write(buffer, 0, 4);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            return await GetBufferByPort(drawerSerial, 11);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        private bool DrawerState(int[] r)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            int index = DrawerNo > 8 ? DrawerNo - 7 : DrawerNo + 1;
							 | 
						|||
| 
								 | 
							
								            return r[index] == 0;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        // 查询抽屉状态
							 | 
						|||
| 
								 | 
							
								        public async Task<byte[]> CheckDrawerStatus()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            drawerSerial.DiscardInBuffer();
							 | 
						|||
| 
								 | 
							
								            byte[] buffer = new byte[] { 0xaa, 0x42, 0xee };
							 | 
						|||
| 
								 | 
							
								            if (_drawerProtocol == 485)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                if (DrawerNo > 8)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    buffer = new byte[] { 0xaa, 0x22, 0xee };
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                else
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    buffer = new byte[] { 0xaa, 0x12, 0xee };
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            logger.Info($"查询抽屉状态,串口数据:{Convert.ToHexString(buffer)}");
							 | 
						|||
| 
								 | 
							
								            drawerSerial.Write(buffer, 0, 3);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            return await GetBufferByPort(drawerSerial, 11);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        #endregion
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        #region can总线串口操作
							 | 
						|||
| 
								 | 
							
								        #region 耗材板操作
							 | 
						|||
| 
								 | 
							
								        // 后门状态
							 | 
						|||
| 
								 | 
							
								        public async Task<byte[]> BackDoorState()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            canBusSerial.DiscardInBuffer();
							 | 
						|||
| 
								 | 
							
								            byte[] buffer = new byte[] { 0xaa, (byte)(_doorAddr), 0x02, 0x00, 0x00, 0x00, 0x00, 0xee };
							 | 
						|||
| 
								 | 
							
								            canBusSerial.Write(buffer, 0, 8);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            return await GetBufferByPort(canBusSerial, 8);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        // 打开电控门储物箱(有灯使能)
							 | 
						|||
| 
								 | 
							
								        public async Task<byte[]> OpenStorage()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            canBusSerial.DiscardInBuffer();
							 | 
						|||
| 
								 | 
							
								            byte[] buffer = new byte[] { 0xaa, (byte)(_doorAddr), 0x01, (byte)_storageBoxAddr, 0x00, 0x00, 0x00, 0xee };
							 | 
						|||
| 
								 | 
							
								            canBusSerial.Write(buffer, 0, 8);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            return await GetBufferByPort(canBusSerial, 8);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        // 关闭电控门储物箱(有灯失能)
							 | 
						|||
| 
								 | 
							
								        public void CloseStorage()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            byte[] buffer = new byte[] { 0xaa, (byte)(_doorAddr), 0x04, 0x00, 0x00, 0x00, 0x00, 0xee };
							 | 
						|||
| 
								 | 
							
								            canBusSerial.Write(buffer, 0, 8);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        // 打开普通储物箱(无灯)
							 | 
						|||
| 
								 | 
							
								        public void OpenStorageBox()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            byte[] buffer = new byte[] { 0xaa, (byte)(_storageBoxAddr), 0x03, 0x00, 0x00, 0x00, 0x00, 0xee };
							 | 
						|||
| 
								 | 
							
								            canBusSerial.Write(buffer, 0, 8);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        // 关闭普通储物箱(无灯)
							 | 
						|||
| 
								 | 
							
								        public void CloseStorageBox()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            byte[] buffer = new byte[] { 0xaa, (byte)(_storageBoxAddr), 0x04, 0x00, 0x00, 0x00, 0x00, 0xee };
							 | 
						|||
| 
								 | 
							
								            canBusSerial.Write(buffer, 0, 8);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        private int[] CheckStorageStatus(int[] data)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            int a = data[0];
							 | 
						|||
| 
								 | 
							
								            int b = data[1];
							 | 
						|||
| 
								 | 
							
								            int[] intA = Decimal2Chunks(a);
							 | 
						|||
| 
								 | 
							
								            int[] intB = Decimal2Chunks(b);
							 | 
						|||
| 
								 | 
							
								            int[] r = new int[intA.Length + intB.Length];
							 | 
						|||
| 
								 | 
							
								            Array.Copy(intA, 0, r, 0, intA.Length);
							 | 
						|||
| 
								 | 
							
								            Array.Copy(intB, 0, r, intA.Length, intB.Length);
							 | 
						|||
| 
								 | 
							
								            return r;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        private int[] Decimal2Chunks(int d)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            string s = Convert.ToString(d, 2);
							 | 
						|||
| 
								 | 
							
								            List<int> t = s.Split().Select(it => Convert.ToInt32(it)).Reverse().ToList();
							 | 
						|||
| 
								 | 
							
								            while (t.Count < 8)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                t.Add(0);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            return t.ToArray();
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        #endregion
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        #region 单支操作
							 | 
						|||
| 
								 | 
							
								        // 以抽屉为单位获取抽屉内所有库位的药品数量
							 | 
						|||
| 
								 | 
							
								        public async Task<byte[]> CheckQuantityByDrawer()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            canBusSerial.DiscardInBuffer();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            byte[] buffer = new byte[] { 0xaa, (byte)(0xf0 + DrawerNo), 0x01, 0x00, 0x00, 0x00, 0x00, 0xee };
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            logger.Info($"单支板发送库位数量查询【{string.Join(",", buffer)}】");
							 | 
						|||
| 
								 | 
							
								            canBusSerial.Write(buffer, 0, 8);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            return await GetBufferByPort(canBusSerial, 13);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        // 获取单个单支板药品数量
							 | 
						|||
| 
								 | 
							
								        public async Task<byte[]> CheckQuantityByCol(int DrawerNo, int colNo)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            canBusSerial.DiscardInBuffer();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            var channel = Convert.ToInt32((DrawerNo * 10 + colNo).ToString(), 16);
							 | 
						|||
| 
								 | 
							
								            byte[] buffer = new byte[] { 0xaa, (byte)channel, 0x08, 0x00, 0x00, 0x00, 0x00, 0xee };
							 | 
						|||
| 
								 | 
							
								            canBusSerial.Write(buffer, 0, 8);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            return await GetBufferByPort(canBusSerial, 8);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        // 以抽屉为单位有药位置亮灯
							 | 
						|||
| 
								 | 
							
								        public void HasLightOnByDrawer()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            byte[] buffer = new byte[] { 0xaa, (byte)(0xf0 + DrawerNo), 0x02, 0x00, 0x00, 0x00, 0x00, 0xee };
							 | 
						|||
| 
								 | 
							
								            canBusSerial.Write(buffer, 0, 8);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        // 以抽屉为单位无药位置亮灯
							 | 
						|||
| 
								 | 
							
								        public void NoLightOnByDrawer()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            byte[] buffer = new byte[] { 0xaa, (byte)(0xf0 + DrawerNo), 0x03, 0x00, 0x00, 0x00, 0x00, 0xee };
							 | 
						|||
| 
								 | 
							
								            canBusSerial.Write(buffer, 0, 8);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        // 以抽屉为单位灭灯
							 | 
						|||
| 
								 | 
							
								        public void LightOffByDrawer()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            byte[] buffer = new byte[] { 0xaa, (byte)(0xf0 + DrawerNo), 0x06, 0x00, 0x00, 0x00, 0x00, 0xee };
							 | 
						|||
| 
								 | 
							
								            canBusSerial.Write(buffer, 0, 8);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        // 以单支板为单位有药位置亮灯
							 | 
						|||
| 
								 | 
							
								        public async Task HasLightOnByCol()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            for (int i = 0; i < ColNos.Length; i++)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                var channel = Convert.ToInt32((DrawerNo * 10 + ColNos[i]).ToString(), 16);
							 | 
						|||
| 
								 | 
							
								                byte[] buffer = new byte[] { 0xaa, (byte)channel, 0x0a, 0x00, 0x00, 0x00, 0x00, 0xee };
							 | 
						|||
| 
								 | 
							
								                canBusSerial.Write(buffer, 0, 8);
							 | 
						|||
| 
								 | 
							
								                await Task.Delay(TimeSpan.FromMilliseconds(20));
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        // 以单支板为单位无药位置亮灯
							 | 
						|||
| 
								 | 
							
								        public async Task NoLightOnByCol()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            for (int i = 0; i < ColNos.Length; i++)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                var channel = Convert.ToInt32((DrawerNo * 10 + ColNos[i]).ToString(), 16);
							 | 
						|||
| 
								 | 
							
								                byte[] buffer = new byte[] { 0xaa, (byte)channel, 0x0b, 0x00, 0x00, 0x00, 0x00, 0xee };
							 | 
						|||
| 
								 | 
							
								                canBusSerial.Write(buffer, 0, 8);
							 | 
						|||
| 
								 | 
							
								                await Task.Delay(TimeSpan.FromMilliseconds(20));
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        // 广播灭灯
							 | 
						|||
| 
								 | 
							
								        public void AllLightOff()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            byte[] buffer = new byte[] { 0xaa, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0xee };
							 | 
						|||
| 
								 | 
							
								            canBusSerial.Write(buffer, 0, 8);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        #endregion
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        #region 药盒操作
							 | 
						|||
| 
								 | 
							
								        // 指定药盒指示灯开启使能开锁
							 | 
						|||
| 
								 | 
							
								        public async Task BoxLockLightOn()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            for (int i = 0; i < ColNos.Length; i++)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                var channel = Convert.ToInt32((DrawerNo * 10 + ColNos[i]).ToString(), 16);
							 | 
						|||
| 
								 | 
							
								                byte[] buffer = new byte[] { 0xaa, (byte)channel, 0x03, 0x00, 0x00, 0x00, 0x00, 0xee };
							 | 
						|||
| 
								 | 
							
								                canBusSerial.Write(buffer, 0, 8);
							 | 
						|||
| 
								 | 
							
								                await Task.Delay(TimeSpan.FromMilliseconds(20));
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        // 指定药盒指示灯开启失能开锁
							 | 
						|||
| 
								 | 
							
								        public async Task BoxLockLightOff()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            for (int i = 0; i < ColNos.Length; i++)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                var channel = Convert.ToInt32((DrawerNo * 10 + ColNos[i]).ToString(), 16);
							 | 
						|||
| 
								 | 
							
								                byte[] buffer = new byte[] { 0xaa, (byte)channel, 0x04, 0x00, 0x00, 0x00, 0x00, 0xee };
							 | 
						|||
| 
								 | 
							
								                canBusSerial.Write(buffer, 0, 8);
							 | 
						|||
| 
								 | 
							
								                await Task.Delay(TimeSpan.FromMilliseconds(20));
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        // 指定药盒状态查询
							 | 
						|||
| 
								 | 
							
								        public async Task<byte[]> BoxLockState(int ColNo)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            canBusSerial.DiscardInBuffer();
							 | 
						|||
| 
								 | 
							
								            var channel = Convert.ToInt32((DrawerNo * 10 + ColNo).ToString(), 16);
							 | 
						|||
| 
								 | 
							
								            byte[] buffer = new byte[] { 0xaa, (byte)channel, 0x02, 0x00, 0x00, 0x00, 0x00, 0xee };
							 | 
						|||
| 
								 | 
							
								            canBusSerial.Write(buffer, 0, 8);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            return await GetBufferByPort(canBusSerial, 8);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        // 以抽屉为单位药盒指示灯开启使能开锁
							 | 
						|||
| 
								 | 
							
								        public async Task BoxLockLightOnByDrawer()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            canBusSerial.DiscardInBuffer();
							 | 
						|||
| 
								 | 
							
								            byte[] buffer = new byte[] { 0xaa, (byte)(0xf0 + DrawerNo), 0x04, 0x00, 0x00, 0x00, 0x00, 0xee };
							 | 
						|||
| 
								 | 
							
								            canBusSerial.Write(buffer, 0, 8);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        // 以抽屉为单位药盒指示灯开启失能开锁
							 | 
						|||
| 
								 | 
							
								        public async Task BoxLockLightOffByDrawer()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            canBusSerial.DiscardInBuffer();
							 | 
						|||
| 
								 | 
							
								            byte[] buffer = new byte[] { 0xaa, (byte)(0xf0 + DrawerNo), 0x05, 0x00, 0x00, 0x00, 0x00, 0xee };
							 | 
						|||
| 
								 | 
							
								            canBusSerial.Write(buffer, 0, 8);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        #endregion
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        private string trim(string text)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            //此处使用了转义字符如:\',\",\\,分别表示单引号,双引号,反斜杠
							 | 
						|||
| 
								 | 
							
								            char[] TrimChar = { ' ', '-', '\'', '\"', '\\', '(', ')', '(', ')', '①', '②' };
							 | 
						|||
| 
								 | 
							
								            return text.Trim(TrimChar);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        #region 2.4寸汉显屏
							 | 
						|||
| 
								 | 
							
								        // 基础数据写入方法
							 | 
						|||
| 
								 | 
							
								        public void WriteChannelInfo(int type, string content, int drawerNo, int colNo)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            try
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                canBusSerial.DiscardInBuffer();
							 | 
						|||
| 
								 | 
							
								                Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
							 | 
						|||
| 
								 | 
							
								                byte[] contentBuf = Encoding.GetEncoding("gb2312").GetBytes(trim(content));
							 | 
						|||
| 
								 | 
							
								                int channel = ((drawerNo > 8 ? (drawerNo - 8) * 2 : (drawerNo * 2 - 1)) - 1) * this.labelCount + 10 + colNo;
							 | 
						|||
| 
								 | 
							
								                if (contentBuf.Length % 2 != 0)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    Array.Resize(ref contentBuf, contentBuf.Length + 1);
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                byte[] buffer = new byte[] { 0xaa, (byte)channel, 1, (byte)type, 0, 0, 0, 0xee };
							 | 
						|||
| 
								 | 
							
								                canBusSerial.Write(buffer, 0, 8);
							 | 
						|||
| 
								 | 
							
								                //await Task.Delay(20);
							 | 
						|||
| 
								 | 
							
								                Thread.Sleep(20);
							 | 
						|||
| 
								 | 
							
								                buffer[4] = 1;
							 | 
						|||
| 
								 | 
							
								                for (int i = 0; i < contentBuf.Length; i += 2)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    buffer[5] = contentBuf[i];
							 | 
						|||
| 
								 | 
							
								                    buffer[6] = contentBuf[i + 1];
							 | 
						|||
| 
								 | 
							
								                    canBusSerial.Write(buffer, 0, 8);
							 | 
						|||
| 
								 | 
							
								                    //await Task.Delay(20);
							 | 
						|||
| 
								 | 
							
								                    Thread.Sleep(20);
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                buffer[4] = 2;
							 | 
						|||
| 
								 | 
							
								                buffer[5] = 0;
							 | 
						|||
| 
								 | 
							
								                buffer[6] = 0;
							 | 
						|||
| 
								 | 
							
								                canBusSerial.Write(buffer, 0, 8);
							 | 
						|||
| 
								 | 
							
								                //await Task.Delay(20);
							 | 
						|||
| 
								 | 
							
								                Thread.Sleep(20);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            catch (Exception ex)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                _eventAggregator.GetEvent<PortUtilEvent>().Publish(new util.DeviceMsg()
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    EventType = util.EventType.OPENERROR,
							 | 
						|||
| 
								 | 
							
								                    WindowName = WindowName,
							 | 
						|||
| 
								 | 
							
								                    Message = $"2.4寸汉显屏异常{ex.Message}"
							 | 
						|||
| 
								 | 
							
								                });
							 | 
						|||
| 
								 | 
							
								                logger.Info($"2.4寸汉显屏异常:ex:{ex.Message}");
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        // 清除显示内容
							 | 
						|||
| 
								 | 
							
								        public void ClearContent(int drawerNo, int colNo)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            canBusSerial.DiscardInBuffer();
							 | 
						|||
| 
								 | 
							
								            int channel = ((drawerNo > 8 ? (drawerNo - 8) * 2 : (drawerNo * 2 - 1)) - 1) * this.labelCount + 10 + colNo;
							 | 
						|||
| 
								 | 
							
								            byte[] buffer = new byte[] { 0xaa, (byte)channel, 4, 0, 0, 0, 0, 0xee };
							 | 
						|||
| 
								 | 
							
								            canBusSerial.Write(buffer, 0, 8);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        // 刷新显示内容
							 | 
						|||
| 
								 | 
							
								        public void ShowContent(int drawerNo, int colNo)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            try
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                canBusSerial.DiscardInBuffer();
							 | 
						|||
| 
								 | 
							
								                int channel = ((drawerNo > 8 ? (drawerNo - 8) * 2 : (drawerNo * 2 - 1)) - 1) * this.labelCount + 10 + colNo;
							 | 
						|||
| 
								 | 
							
								                byte[] buffer = new byte[] { 0xaa, (byte)channel, 2, 0, 0, 0, 0, 0xee };
							 | 
						|||
| 
								 | 
							
								                canBusSerial.Write(buffer, 0, 8);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            catch (Exception ex)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                _eventAggregator.GetEvent<PortUtilEvent>().Publish(new util.DeviceMsg()
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    EventType = util.EventType.OPENERROR,
							 | 
						|||
| 
								 | 
							
								                    WindowName = WindowName,
							 | 
						|||
| 
								 | 
							
								                    Message = $"刷新显示内容异常{ex.Message}"
							 | 
						|||
| 
								 | 
							
								                });
							 | 
						|||
| 
								 | 
							
								                logger.Info($"刷新显示内容异常:ex:{ex.Message}");
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        // 取药或者加药亮灯
							 | 
						|||
| 
								 | 
							
								        public void TakeQuantity(int drawerNo, int colNo, int quantity, int stock)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            try
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                canBusSerial.DiscardInBuffer();
							 | 
						|||
| 
								 | 
							
								                //int channel = (drawerNo * 10 + colNo);
							 | 
						|||
| 
								 | 
							
								                int channel = ((drawerNo > 8 ? (drawerNo - 8) * 2 : (drawerNo * 2 - 1)) - 1) * this.labelCount + 10 + colNo;
							 | 
						|||
| 
								 | 
							
								                byte[] buffer = new byte[] { 0xaa, (byte)channel, 6, 0, 0, 0, 0, 0xee };
							 | 
						|||
| 
								 | 
							
								                buffer[3] = (byte)(quantity >> 8);
							 | 
						|||
| 
								 | 
							
								                buffer[4] = (byte)(quantity & 0xff);
							 | 
						|||
| 
								 | 
							
								                buffer[5] = (byte)(stock >> 8);
							 | 
						|||
| 
								 | 
							
								                buffer[6] = (byte)(stock & 0xff);
							 | 
						|||
| 
								 | 
							
								                canBusSerial.Write(buffer, 0, 8);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            catch (Exception ex)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                _eventAggregator.GetEvent<PortUtilEvent>().Publish(new util.DeviceMsg()
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    EventType = util.EventType.OPENERROR,
							 | 
						|||
| 
								 | 
							
								                    WindowName = WindowName,
							 | 
						|||
| 
								 | 
							
								                    Message = $"操作发生异常{ex.Message}"
							 | 
						|||
| 
								 | 
							
								                });
							 | 
						|||
| 
								 | 
							
								                logger.Info($"操作发生异常:ex:{ex.Message}");
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        // 写入数量
							 | 
						|||
| 
								 | 
							
								        public void WriteQuantity(int drawerNo, int colNo, int quantity)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            try
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                canBusSerial.DiscardInBuffer();
							 | 
						|||
| 
								 | 
							
								                int channel = ((drawerNo > 8 ? (drawerNo - 8) * 2 : (drawerNo * 2 - 1)) - 1) * this.labelCount + 10 + colNo;
							 | 
						|||
| 
								 | 
							
								                byte[] buffer = new byte[] { 0xaa, (byte)channel, 0x21, 0, 0, 0, 0, 0xee };
							 | 
						|||
| 
								 | 
							
								                buffer[5] = (byte)(quantity >> 8);
							 | 
						|||
| 
								 | 
							
								                buffer[6] = (byte)(quantity & 0xff);
							 | 
						|||
| 
								 | 
							
								                canBusSerial.Write(buffer, 0, 8);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            catch (Exception ex)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                _eventAggregator.GetEvent<PortUtilEvent>().Publish(new util.DeviceMsg()
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    EventType = util.EventType.OPENERROR,
							 | 
						|||
| 
								 | 
							
								                    WindowName = WindowName,
							 | 
						|||
| 
								 | 
							
								                    Message = $"操作发生异常{ex.Message}"
							 | 
						|||
| 
								 | 
							
								                });
							 | 
						|||
| 
								 | 
							
								                logger.Info($"操作发生异常:ex:{ex.Message}");
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        public async Task WriteQuantityArray()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            for (int i = 0; i < ColNos.Length; i++)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                WriteQuantity(DrawerNo, ColNos[i], Stocks[i]);
							 | 
						|||
| 
								 | 
							
								                 await Task.Delay(TimeSpan.FromMilliseconds(20));
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        #endregion
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        #region 回收箱操作
							 | 
						|||
| 
								 | 
							
								        // 打开回收箱
							 | 
						|||
| 
								 | 
							
								        public async Task<byte[]> OpenRecover()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            try
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                canBusSerial.DiscardInBuffer();
							 | 
						|||
| 
								 | 
							
								                byte[] buffer = new byte[] { 0xAA, 0x9A, 0x04, 0x00, 0x00, 0x00, 0x00, 0xEE };
							 | 
						|||
| 
								 | 
							
								                canBusSerial.Write(buffer, 0, 8);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                return await GetBufferByPort(canBusSerial, 8);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            catch (Exception ex)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                _eventAggregator.GetEvent<PortUtilEvent>().Publish(new util.DeviceMsg()
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    EventType = util.EventType.OPENERROR,
							 | 
						|||
| 
								 | 
							
								                    WindowName = WindowName,
							 | 
						|||
| 
								 | 
							
								                    Message = $"操作发生异常{ex.Message}"
							 | 
						|||
| 
								 | 
							
								                });
							 | 
						|||
| 
								 | 
							
								                logger.Info($"操作发生异常:ex:{ex.Message}");
							 | 
						|||
| 
								 | 
							
								                return null;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								           
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        // 回收箱状态查询
							 | 
						|||
| 
								 | 
							
								        public async Task<byte[]> CheckRecoverStatus()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            try
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                canBusSerial.DiscardInBuffer();
							 | 
						|||
| 
								 | 
							
								                byte[] buffer = new byte[] { 0xAA, 0x9A, 0x03, 0x00, 0x00, 0x00, 0x00, 0xEE };
							 | 
						|||
| 
								 | 
							
								                canBusSerial.Write(buffer, 0, 8);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                return await GetBufferByPort(canBusSerial, 8);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            catch (Exception ex)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                _eventAggregator.GetEvent<PortUtilEvent>().Publish(new util.DeviceMsg()
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    EventType = util.EventType.OPENERROR,
							 | 
						|||
| 
								 | 
							
								                    WindowName = WindowName,
							 | 
						|||
| 
								 | 
							
								                    Message = $"操作发生异常{ex.Message}"
							 | 
						|||
| 
								 | 
							
								                });
							 | 
						|||
| 
								 | 
							
								                logger.Info($"操作发生异常:ex:{ex.Message}");
							 | 
						|||
| 
								 | 
							
								                return null;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        // 回收箱回收数量查询
							 | 
						|||
| 
								 | 
							
								        public async Task<byte[]> CheckRecoverQuantity()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            try
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                canBusSerial.DiscardInBuffer();
							 | 
						|||
| 
								 | 
							
								                byte[] buffer = new byte[] { 0xAA, 0x9A, (byte)(ColNos[0] > 3 ? 2 : 1), 0x00, 0x00, 0x00, 0x00, 0xEE };
							 | 
						|||
| 
								 | 
							
								                canBusSerial.Write(buffer, 0, 8);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                return await GetBufferByPort(canBusSerial, 8);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            catch (Exception ex)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                _eventAggregator.GetEvent<PortUtilEvent>().Publish(new util.DeviceMsg()
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    EventType = util.EventType.OPENERROR,
							 | 
						|||
| 
								 | 
							
								                    WindowName = WindowName,
							 | 
						|||
| 
								 | 
							
								                    Message = $"操作发生异常{ex.Message}"
							 | 
						|||
| 
								 | 
							
								                });
							 | 
						|||
| 
								 | 
							
								                logger.Info($"操作发生异常:ex:{ex.Message}");
							 | 
						|||
| 
								 | 
							
								                return null;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        #endregion
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        #region 称重操作
							 | 
						|||
| 
								 | 
							
								        // 以板子为单位获取抽屉内所有库位的药品数量
							 | 
						|||
| 
								 | 
							
								        public async Task<byte[]> CheckQuantityByAddr()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            canBusSerial.DiscardInBuffer();
							 | 
						|||
| 
								 | 
							
								            var channel = Convert.ToInt32((DrawerNo * 10 + 1).ToString(), 16);
							 | 
						|||
| 
								 | 
							
								            byte[] buffer = new byte[] { 0xaa, (byte)(channel), 0x28, 0x00, 0x00, 0x00, 0x00, 0xee };
							 | 
						|||
| 
								 | 
							
								            logger.Info($"称重发送库位数量查询1【{string.Join(",", buffer)}】");
							 | 
						|||
| 
								 | 
							
								            canBusSerial.Write(buffer, 0, 8);
							 | 
						|||
| 
								 | 
							
								            byte[] result1 = await GetBufferByPort(canBusSerial, 8);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            var channel2 = Convert.ToInt32((DrawerNo * 10 + 2).ToString(), 16);
							 | 
						|||
| 
								 | 
							
								            byte[] buffer2 = new byte[] { 0xaa, (byte)(channel2), 0x28, 0x00, 0x00, 0x00, 0x00, 0xee };
							 | 
						|||
| 
								 | 
							
								            logger.Info($"称重发送库位数量查询2【{string.Join(",", buffer2)}】");
							 | 
						|||
| 
								 | 
							
								            canBusSerial.Write(buffer2, 0, 8);
							 | 
						|||
| 
								 | 
							
								            byte[] result2 = await GetBufferByPort(canBusSerial, 8);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            byte[] res = new byte[6];
							 | 
						|||
| 
								 | 
							
								            Array.Copy(result1, 3, res, 0, 3);
							 | 
						|||
| 
								 | 
							
								            Array.Copy(result2, 3, res, 3, 3);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            return res;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        // 以板子为单位获取抽屉内所有库位的药品数量
							 | 
						|||
| 
								 | 
							
								        public async Task<int[]> CheckQuantityByAddr2()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            int[] res = new int[6];
							 | 
						|||
| 
								 | 
							
								            for (int i = 0; i < ColNos.Length; i++)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                canBusSerial.DiscardInBuffer();
							 | 
						|||
| 
								 | 
							
								                var index = ColNos[i] > 3 ? 2 : 1;
							 | 
						|||
| 
								 | 
							
								                var lock1 = ColNos[i] % 3 == 0 ? 3 : ColNos[i] % 3;
							 | 
						|||
| 
								 | 
							
								                var channel = Convert.ToInt32((DrawerNo * 10 + index).ToString(), 16);
							 | 
						|||
| 
								 | 
							
								                byte[] buffer = new byte[] { 0xaa, (byte)(channel), 0x27, (byte)lock1, 0x00, 0x00, 0x00, 0xee };
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                logger.Info($"称重发送库位数量查询1【{string.Join(",", buffer)}】");
							 | 
						|||
| 
								 | 
							
								                canBusSerial.Write(buffer, 0, 8);
							 | 
						|||
| 
								 | 
							
								                byte[] result = await GetBufferByPort(canBusSerial, 8);
							 | 
						|||
| 
								 | 
							
								                logger.Info($"称重发送库位数量查询1返回结果【{string.Join(",", result)}】");
							 | 
						|||
| 
								 | 
							
								                byte[] hl = result.Skip(3).Take(2).ToArray();
							 | 
						|||
| 
								 | 
							
								                int quantity = BitConverter.ToInt16(hl.Reverse().ToArray(), 0);
							 | 
						|||
| 
								 | 
							
								                res[ColNos[i] - 1] = quantity;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            return res;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        // 指定药盒指示灯开启使能开锁
							 | 
						|||
| 
								 | 
							
								        public async Task BoxLockLightOn2()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            for (int i = 0; i < ColNos.Length; i++)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                var index = ColNos[i] > 3 ? 2 : 1;
							 | 
						|||
| 
								 | 
							
								                var lock1 = ColNos[i] % 3 == 0 ? 3 : ColNos[i] % 3;
							 | 
						|||
| 
								 | 
							
								                var channel = Convert.ToInt32((DrawerNo * 10 + index).ToString(), 16);
							 | 
						|||
| 
								 | 
							
								                byte[] buffer = new byte[] { 0xaa, (byte)(channel), 0x03, (byte)lock1, 0x00, 0x00, 0x00, 0xee };
							 | 
						|||
| 
								 | 
							
								                logger.Info($"称重发送药盒使能【{string.Join(",", buffer)}】");
							 | 
						|||
| 
								 | 
							
								                canBusSerial.Write(buffer, 0, 8);
							 | 
						|||
| 
								 | 
							
								                await Task.Delay(TimeSpan.FromMilliseconds(500));
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        // 指定药盒指示灯开启失能开锁
							 | 
						|||
| 
								 | 
							
								        public async Task BoxLockLightOff2()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            canBusSerial.DiscardInBuffer();
							 | 
						|||
| 
								 | 
							
								            for (int i = 0; i < ColNos.Length; i++)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                var index = ColNos[i] > 3 ? 2 : 1;
							 | 
						|||
| 
								 | 
							
								                var lock1 = ColNos[i] % 3 == 0 ? 3 : ColNos[i] % 3;
							 | 
						|||
| 
								 | 
							
								                var channel = Convert.ToInt32((DrawerNo * 10 + index).ToString(), 16);
							 | 
						|||
| 
								 | 
							
								                byte[] buffer = new byte[] { 0xaa, (byte)(channel), 0x04, (byte)lock1, 0x00, 0x00, 0x00, 0xee };
							 | 
						|||
| 
								 | 
							
								                logger.Info($"称重发送药盒失能【{string.Join(",", buffer)}】");
							 | 
						|||
| 
								 | 
							
								                canBusSerial.Write(buffer, 0, 8);
							 | 
						|||
| 
								 | 
							
								                await Task.Delay(TimeSpan.FromMilliseconds(50));
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public async void ClearCount(int DrawerNo, int ColNo)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            try
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                canBusSerial.DiscardInBuffer();
							 | 
						|||
| 
								 | 
							
								                var index = ColNo > 3 ? 2 : 1;
							 | 
						|||
| 
								 | 
							
								                var lock1 = ColNo % 3 == 0 ? 3 : ColNo % 3;
							 | 
						|||
| 
								 | 
							
								                var channel = Convert.ToInt32((DrawerNo * 10 + index).ToString(), 16);
							 | 
						|||
| 
								 | 
							
								                byte[] buffer = new byte[] { 0xaa, (byte)(channel), 0x25, (byte)lock1, 0x00, 0x00, 0x00, 0xee };
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                logger.Info($"称重发送清空计数【{string.Join(",", buffer)}】");
							 | 
						|||
| 
								 | 
							
								                canBusSerial.Write(buffer, 0, 8);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            catch (Exception ex)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                _eventAggregator.GetEvent<PortUtilEvent>().Publish(new util.DeviceMsg()
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    EventType = util.EventType.OPENERROR,
							 | 
						|||
| 
								 | 
							
								                    WindowName = WindowName,
							 | 
						|||
| 
								 | 
							
								                    Message = $"操作发生异常{ex.Message}"
							 | 
						|||
| 
								 | 
							
								                });
							 | 
						|||
| 
								 | 
							
								                logger.Info($"操作发生异常:ex:{ex.Message},方法名:ClearCount;参数:{DrawerNo},{ColNo}");
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								           
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public async void SetNumCount(int DrawerNo, int ColNo, int Quantity)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            try
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                canBusSerial.DiscardInBuffer();
							 | 
						|||
| 
								 | 
							
								                var index = ColNo > 3 ? 2 : 1;
							 | 
						|||
| 
								 | 
							
								                var lock1 = ColNo % 3 == 0 ? 3 : ColNo % 3;
							 | 
						|||
| 
								 | 
							
								                var channel = Convert.ToInt32((DrawerNo * 10 + index).ToString(), 16);
							 | 
						|||
| 
								 | 
							
								                byte[] buffer = new byte[] { 0xaa, (byte)(channel), 0x26, (byte)lock1, 0x00, 0x00, 0x00, 0xee };
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                buffer[4] = (byte)(Quantity >> 8);
							 | 
						|||
| 
								 | 
							
								                buffer[5] = (byte)(Quantity & 0xff);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                logger.Info($"称重发送数量【{string.Join(",", buffer)}】");
							 | 
						|||
| 
								 | 
							
								                canBusSerial.Write(buffer, 0, 8);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            catch (Exception ex)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                _eventAggregator.GetEvent<PortUtilEvent>().Publish(new util.DeviceMsg()
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    EventType = util.EventType.OPENERROR,
							 | 
						|||
| 
								 | 
							
								                    WindowName = WindowName,
							 | 
						|||
| 
								 | 
							
								                    Message = $"操作发生异常{ex.Message}"
							 | 
						|||
| 
								 | 
							
								                });
							 | 
						|||
| 
								 | 
							
								                logger.Info($"操作发生异常:ex:{ex.Message},方法名:SetNumCount;参数:{DrawerNo},{ColNo},{Quantity}");
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        #endregion
							 | 
						|||
| 
								 | 
							
								        #endregion
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public int labelCount = Convert.ToInt32(ConfigurationManager.AppSettings["labelCount"]);
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								}
							 |