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 DM_Weight.HIKVISION; using PreviewDemo; using System.Runtime.InteropServices; using DM_Weight.Common; using System.Net; using System.Text.RegularExpressions; using Modbus.Device; using Polly; using DM_Weight.Models; 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; // 冰箱串口 //public SerialPort fridgeSerial; // 温湿度串口 public SerialPort wsdSerial; // 抽屉串口协议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 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 bool FridgeOperate { 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(); // } // } // 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[] { }; //} //public async void OpenBox() //{ // logger.Info($"打开药箱,药箱号【{DrawerNo}】"); // Operate = true; // try // { // byte[] buffer = await OpenDrawer(); // int[] r = buffer.Select(it => Convert.ToInt32(it)).ToArray(); // logger.Info($"OpenDrawer{string.Join(",", r)}"); // if (DrawerState(r)) // { // statue = 1; // // 返回消息 抽屉已经打开 // _eventAggregator.GetEvent().Publish(new util.DeviceMsg() // { // EventType = util.EventType.DRAWEROPEN, // WindowName = WindowName, // }); // logger.Info($"药箱【{DrawerNo}】打开成功"); // await Task.Delay(200); // } // else // { // // 返回消息 抽屉打开失败 // _eventAggregator.GetEvent().Publish(new util.DeviceMsg() // { // EventType = util.EventType.OPENERROR, // WindowName = WindowName, // Message = $"药箱【{DrawerNo}】打开失败" // }); // logger.Info($"药箱【{DrawerNo}】打开失败"); // } // } // catch (Exception ex) // { // _eventAggregator.GetEvent().Publish(new util.DeviceMsg() // { // EventType = util.EventType.OPENERROR, // Message = $"打开药箱异常{ex.Message}" // }); // logger.Info($"打开药箱{DrawerNo}异常:{ex.Message}"); // } //} ////查询药箱状态 //public async void GetBoxStatus() //{ // try // { // if (Operate) // { // // 查询药箱状态 // byte[] buffer = await CheckBoxStatus(); // int[] r = buffer.Select(it => Convert.ToInt32(it)).ToArray(); // logger.Info($"GetBoxStatus{string.Join(",", r)}"); // // 药箱没有关闭 // if (DrawerState(r)) // { // // 继续监听药箱状态 // await Task.Delay(200); // GetBoxStatus(); // } // else // { // // 返回消息 药箱已经关闭 // _eventAggregator.GetEvent().Publish(new util.DeviceMsg() // { // EventType = util.EventType.DRAWERCLOSE, // }); // logger.Info($"抽屉【{DrawerNo}】已关闭"); // } // } // } // catch (Exception ex) // { // _eventAggregator.GetEvent().Publish(new util.DeviceMsg() // { // EventType = util.EventType.OPENERROR, // WindowName = WindowName, // Message = $"GetBoxStatus异常:{ex.Message}" // }); // logger.Info($"GetBoxStatus异常:{ex.Message}"); // } //} //public async void Start() //{ // logger.Info($"进行抽屉操作抽屉号【{DrawerNo}】类型【{BoardType}】库位【{string.Join(",", ColNos)}】窗口【{WindowName}】"); // Operate = true; // //开始录像 // //_chkFunction.HIKStartDVRRecord(); // logger.Info($"时间:{DateTime.Now}"); // 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().Publish(new util.DeviceMsg() // { // EventType = util.EventType.OPENERROR, // WindowName = WindowName, // Message = "储物箱使能失败" // }); // logger.Info($"储物箱使能失败"); // } // } // 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().Publish(new util.DeviceMsg() // { // EventType = util.EventType.DRAWEROPEN, // WindowName = WindowName, // }); // logger.Info($"回收箱打开成功"); // // 查询是否关闭状态 // GeRecoverStatus(); // } // else // { // string _WindowName = WindowName; // // 重新初始化数据 // ResetData(); // // 返回消息开启失败 // // 返回消息 抽屉打开失败 // _eventAggregator.GetEvent().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().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().Publish(new util.DeviceMsg() // { // EventType = util.EventType.OPENERROR, // WindowName = WindowName, // Message = $"抽屉【{DrawerNo}】打开失败" // }); // logger.Info($"抽屉【{DrawerNo}】打开失败"); // } // } // } // } // catch (Exception ex) // { // string _WindowName = WindowName; // // 重新初始化数据 // ResetData(); // // 返回消息 抽屉打开失败 // _eventAggregator.GetEvent().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().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().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; // // 重新初始化数据 // ResetData(); // // 返回消息 抽屉已经关闭 // _eventAggregator.GetEvent().Publish(new util.DeviceMsg() // { // EventType = util.EventType.DRAWERCLOSE, // WindowName = _WindowName, // }); // logger.Info($"抽屉【{DrawerNo}】已关闭"); // } // } // } // catch (Exception ex) // { // _eventAggregator.GetEvent().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().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().Publish(new util.DeviceMsg() // { // EventType = util.EventType.DRAWERCLOSE, // WindowName = _WindowName, // }); // logger.Info($"储物箱关闭"); // } // } // // 锁处于打开状态 // if (lockStates[_storageBoxAddr - 1] == 1) // { // // 锁还未打开过,说明打开成功了 // if (statue == 0) // { // statue = 1; // // 告诉前台打开成功 // _eventAggregator.GetEvent().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().Publish(new util.DeviceMsg() // { // EventType = util.EventType.CODESCAN, // Code = code, // }); // }; // scanCodeSerial.Open(); // logger.Info($"条码枪串口打开结果【{scanCodeSerial.IsOpen}】"); //} //catch (Exception e) //{ // logger.Error("条码枪串口打开错误" + e.Message); //} //try //{ // string FridgePortPath = ConfigurationManager.AppSettings["FridgePortPath"]; // logger.Info($"打开冰箱串口【{FridgePortPath}】"); // fridgeSerial = new SerialPort(FridgePortPath, 9600, Parity.None, 8); // fridgeSerial.Open(); // logger.Info($"冰箱串口打开结果【{fridgeSerial.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); // } //} try { string wsdSerialPort = ConfigurationManager.AppSettings["wsdSerialPort"]; logger.Info($"打开温湿度串口【{wsdSerialPort}】"); wsdSerial = new SerialPort(wsdSerialPort, 9600, Parity.None, 8); wsdSerial.Open(); logger.Info($"温湿度串口打开结果【{wsdSerial.IsOpen}】"); } catch (Exception e) { logger.Error("温湿度串口打开错误" + e.Message); } //_chkFunction = chkFunction; } 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) { if (_length != 0) { byte[] _buffer = new byte[_length]; serialPort.Read(_buffer, 0, _length); logger.Info($"交互超时回复:{Convert.ToHexString(buffer)}"); } throw new TimeoutException($"串口【{serialPort.PortName}】交互超时"); } serialPort.Read(buffer, 0, length); // } // catch (Exception ex) // { // logger.Error($"GetBufferByPort:{ex.Message}"); // } return buffer; } private Task 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 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 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); //} //// 查询药箱状态 //public async Task CheckBoxStatus() //{ // 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 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 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); // int[] chars = new int[8]; // char[] schar = s.ToCharArray(); // Array.Reverse(schar); // int[] iArray = Array.ConvertAll(schar, c => (int)Char.GetNumericValue(c)); // int[] addArray = new int[8 - iArray.Length]; // if (iArray.Length < 8) // { // for (int i = 0; i < 8 - iArray.Length; i++) // { // addArray[i] = 0; // } // chars = iArray.Concat(addArray).ToArray(); // } // else // { // chars = iArray[0..iArray.Length]; // } // return chars; // //List 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 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 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 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 //#region 药盒操作 ///// ///// 打开药盒 ///// ///// ///// //public async Task OpenBox(int ColNo) //{ // var vlock = 321; // decimal decolNO = (decimal)ColNo; // var channel = Convert.ToInt32((DrawerNo * 10 + Math.Ceiling(decolNO % 3)).ToString(), 16); // byte[] buffer = new byte[] { 0xaa, (byte)channel, 5, (byte)vlock, 0x00, 0x00, 0x00, 0xee }; // canBusSerial.Write(buffer, 0, 8); // await Task.Delay(TimeSpan.FromMilliseconds(20)); //} ///// ///// 查询药盒状态 ///// ///// ///// //public async Task GetBoxLockState(int ColNo) //{ // decimal deColNo = (decimal)ColNo; // var channel = Convert.ToInt32((DrawerNo * 10 + Math.Ceiling(deColNo / 3)).ToString(), 16); // byte[] buffer = new byte[] { 0xaa, (byte)channel, 2, 0, 0, 0, 0, 0xee }; // canBusSerial.Write(buffer, 0, 8); // return await GetBufferByPort(canBusSerial, 8); //} //#endregion //private string trim(string text) //{ // //此处使用了转义字符如:\',\",\\,分别表示单引号,双引号,反斜杠 // char[] TrimChar = { ' ', '-', '\'', '\"', '\\', '(', ')', '(', ')', '①', '②' }; // return text.Trim(TrimChar); //} //#region 2.4寸汉显屏 //// 基础数据写入方法 //public async 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 * 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); // 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); // } // buffer[4] = 2; // buffer[5] = 0; // buffer[6] = 0; // canBusSerial.Write(buffer, 0, 8); // await Task.Delay(20); // } // catch (Exception ex) // { // _eventAggregator.GetEvent().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 * 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 * 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().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 = Convert.ToInt32((drawerNo * 10 + colNo).ToString(), 16); // 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().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 * 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().Publish(new util.DeviceMsg() // { // EventType = util.EventType.OPENERROR, // WindowName = WindowName, // Message = $"操作发生异常{ex.Message}" // }); // logger.Info($"操作发生异常:ex:{ex.Message}"); // } //} //#endregion //#region 标签显示屏 ////清屏 //public void ClearContentMethod(int drawerNo, int colNo) //{ // decimal deColNo = colNo; // var channel = drawerNo * 10 + Math.Ceiling(deColNo / 3); // var colNo2 = 321; // byte[] buffer = new byte[] { 0xaa }; // canBusSerial.Write(buffer, 0, 8); //} //#endregion //#region 回收箱操作 //// 打开回收箱 //public async Task 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().Publish(new util.DeviceMsg() // { // EventType = util.EventType.OPENERROR, // WindowName = WindowName, // Message = $"操作发生异常{ex.Message}" // }); // logger.Info($"操作发生异常:ex:{ex.Message}"); // return null; // } //} //// 回收箱状态查询 //public async Task 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().Publish(new util.DeviceMsg() // { // EventType = util.EventType.OPENERROR, // WindowName = WindowName, // Message = $"操作发生异常{ex.Message}" // }); // logger.Info($"操作发生异常:ex:{ex.Message}"); // return null; // } //} //// 回收箱回收数量查询 //public async Task CheckRecoverQuantity() //{ // try // { // canBusSerial.DiscardInBuffer(); // byte[] buffer = new byte[] { 0xAA, 0x9A, (byte)(ColNos[0] > 3 ? 2 : 1), 0x00, 0x00, 0x00, 0x00, 0xEE }; // //byte[] buffer = new byte[] { 0xAA, 0x9A, 01, (byte)(ColNos[0] > 3 ? 2 : 1), 0x00, 0x00, 0x00, 0xEE }; // canBusSerial.Write(buffer, 0, 8); // return await GetBufferByPort(canBusSerial, 8); // } // catch (Exception ex) // { // _eventAggregator.GetEvent().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 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 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().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().Publish(new util.DeviceMsg() // { // EventType = util.EventType.OPENERROR, // WindowName = WindowName, // Message = $"操作发生异常{ex.Message}" // }); // logger.Info($"操作发生异常:ex:{ex.Message},方法名:SetNumCount;参数:{DrawerNo},{ColNo},{Quantity}"); // } //} //#endregion ///// ///// 冰箱使能 ///// ///// //public async Task FridegOpen(int iIndex) //{ // try // { // fridgeSerial.DiscardInBuffer(); // byte bAddress; // if (iIndex == 1) // { // bAddress = 0x01; // } // else // { // bAddress = 0x02; // } // byte[] buffer = new byte[] { bAddress, 0x06, 0x10, 0xD4, 0x00, 0x01, 0x0C, 0xF2 }; // //byte[] buffer = new byte[] { 0x01, 0x06, 0x10, 0xD4, 0x00, 0x01 }; // ////获取数组CRC校验码 // //byte[] byteDate = CRC16MODBUS.CrcModBus(buffer); // ////Array.Reverse(byteDate); // //int dataLength = buffer.Length; // //Array.Resize(ref buffer, dataLength + byteDate.Length); // //for (int i = 0; i < byteDate.Length; i++) // //{ // // buffer[dataLength + i] = byteDate[i]; // //} // logger.Info($"冰箱使能【{Convert.ToHexString(buffer)}】"); // fridgeSerial.Write(buffer, 0, 8); // await Task.Delay(80); // } // catch (Exception ex) // { // logger.Info($"冰箱使能发生异常:ex:{ex.Message}"); // } // FridgeOperate = false; //} ///// ///// 冰箱失能 ///// ///// //public async Task FridgeOff(int iIndex) //{ // try // { // fridgeSerial.DiscardInBuffer(); // byte bAddress; // if (iIndex == 1) // { // bAddress = 0x01; // } // else // { // bAddress = 0x02; // } // byte[] buffer = new byte[] { bAddress, 0x06, 0x10, 0xD4, 0x00, 0x00, 0xCD, 0x32 }; // //byte[] buffer = new byte[] { 0x01, 0x06, 0x10, 0xD4, 0x00, 0x01 }; // ////获取数组CRC校验码 // //byte[] byteDate = CRC16MODBUS.CrcModBus(buffer); // ////Array.Reverse(byteDate); // //int dataLength = buffer.Length; // //Array.Resize(ref buffer, dataLength + byteDate.Length); // //for (int i = 0; i < byteDate.Length; i++) // //{ // // buffer[dataLength + i] = byteDate[i]; // //} // logger.Info($"冰箱失能【{Convert.ToHexString(buffer)}】"); // fridgeSerial.Write(buffer, 0, 8); // await Task.Delay(80); // } // catch (Exception ex) // { // logger.Info($"冰箱失能发生异常:ex:{ex.Message}"); // } // FridgeOperate = false; //} ///// ///// 冰箱报警使能 ///// ///// //public async Task FridgeAlarmOn(int iIndex) //{ // try // { // fridgeSerial.DiscardInBuffer(); // byte bAddress; // if (iIndex == 1) // { // bAddress = 0x01; // } // else // { // bAddress = 0x02; // } // byte[] buffer = new byte[] { bAddress, 0x06, 0x10, 0xD5, 0x00, 0x01, 0x5D, 0x32 }; // //byte[] buffer = new byte[] { 0x01, 0x06, 0x10, 0xD5, 0x00, 0x01 }; // ////获取数组CRC校验码 // //byte[] byteDate = CRC16MODBUS.CrcModBus(buffer); // ////Array.Reverse(byteDate); // //int dataLength = buffer.Length; // //Array.Resize(ref buffer, dataLength + byteDate.Length); // //for (int i = 0; i < byteDate.Length; i++) // //{ // // buffer[dataLength + i] = byteDate[i]; // //} // logger.Info($"冰箱报警使能【{Convert.ToHexString(buffer)}】"); // fridgeSerial.Write(buffer, 0, 8); // await Task.Delay(80); // } // catch (Exception ex) // { // logger.Info($"冰箱报警使能发生异常:ex:{ex.Message}"); // } // FridgeOperate = false; //} ///// ///// 冰箱报警失能 ///// ///// //public async Task FridgeAlarmOff(int iIndex) //{ // try // { // fridgeSerial.DiscardInBuffer(); // byte bAddress; // if (iIndex == 1) // { // bAddress = 0x01; // } // else // { // bAddress = 0x02; // } // byte[] buffer = new byte[] { bAddress, 0x06, 0x10, 0xD5, 0x00, 0x00, 0x9C, 0xF2 }; // //byte[] buffer = new byte[] { 0x01, 0x06, 0x10, 0xD5, 0x00, 0x00 }; // ////获取数组CRC校验码 // //byte[] byteDate = CRC16MODBUS.CrcModBus(buffer); // ////Array.Reverse(byteDate); // //int dataLength = buffer.Length; // //Array.Resize(ref buffer, dataLength + byteDate.Length); // //for (int i = 0; i < byteDate.Length; i++) // //{ // // buffer[dataLength + i] = byteDate[i]; // //} // logger.Info($"冰箱报警失能【{Convert.ToHexString(buffer)}】"); // fridgeSerial.Write(buffer, 0, 8); // await Task.Delay(80); // } // catch (Exception ex) // { // logger.Info($"冰箱报警失能发生异常:ex:{ex.Message}"); // } // FridgeOperate = false; //} ///// ///// 冰箱温度设定最小 ///// ///// //public async Task FridgeMinSetting(float min, int iIndex) //{ // try // { // int iMix = Convert.ToInt32(min * 10); // fridgeSerial.DiscardInBuffer(); // //byte[] bufferMin = new byte[] { 0x01, 0x06, 0x10, 0xC9, 0x00, 0x15, 0x9C, 0xFB }; // byte bAddress; // if (iIndex == 1) // { // bAddress = 0x01; // } // else // { // bAddress = 0x02; // } // byte[] bufferMin = new byte[] { bAddress, 0x06, 0x10, 0xC9, 0x00, (byte)(iMix & 0xff) }; // //获取数组CRC校验码 // byte[] byteDate = CRC16MODBUS.CrcModBus(bufferMin); // //Array.Reverse(byteDate); // int dataLength = bufferMin.Length; // Array.Resize(ref bufferMin, dataLength + byteDate.Length); // for (int i = 0; i < byteDate.Length; i++) // { // bufferMin[dataLength + i] = byteDate[i]; // } // logger.Info($"冰箱温度设定Min:【{Convert.ToHexString(bufferMin)}】"); // fridgeSerial.Write(bufferMin, 0, 8); // } // catch (Exception ex) // { // logger.Info($"获取冰箱温度发生异常:ex:{ex.Message}"); // } //} ///// ///// 冰箱温度设定最大 ///// ///// //public async Task FridgeMaxSetting(float max, int iIndex) //{ // try // { // int iMax = Convert.ToInt32(max * 10); // fridgeSerial.DiscardInBuffer(); // //byte[] bufferMin = new byte[] { 0x01, 0x06, 0x10, 0xC9, 0x00, 0x15, 0x9C, 0xFB }; // byte bAddress; // if (iIndex == 1) // { // bAddress = 0x01; // } // else // { // bAddress = 0x02; // } // byte[] bufferMax = new byte[] { bAddress, 0x06, 0x10, 0xC8, 0x00, (byte)(iMax & 0xff) }; // //获取数组CRC校验码 // byte[] byteDate = CRC16MODBUS.CrcModBus(bufferMax); // //Array.Reverse(byteDate); // int dataLength = bufferMax.Length; // Array.Resize(ref bufferMax, dataLength + byteDate.Length); // for (int i = 0; i < byteDate.Length; i++) // { // bufferMax[dataLength + i] = byteDate[i]; // } // logger.Info($"冰箱温度设定Max:【{Convert.ToHexString(bufferMax)}】"); // fridgeSerial.Write(bufferMax, 0, 8); // } // catch (Exception ex) // { // logger.Info($"获取冰箱温度发生异常:ex:{ex.Message}"); // } //} ///// ///// 获取冰箱温度 ///// ///// //public async Task GetFridgeTemperature(int iIndex) //{ // float temperature = 0.0f; // try // { // fridgeSerial.DiscardInBuffer(); // byte bAddress; // if (iIndex == 1) // { // bAddress = 0x01; // } // else // { // bAddress = 0x02; // } // byte[] buffer = new byte[] { bAddress, 0x03, 0x10, 0x02, 0x00, 0x01, 0x21, 0x0A }; // //byte[] buffer = new byte[] { 0x01, 0x03, 0x10, 0x02, 0x00, 0x01 }; // ////获取数组CRC校验码 // //byte[] byteDate = CRC16MODBUS.CrcModBus(buffer); // ////Array.Reverse(byteDate); // //int dataLength = buffer.Length; // //Array.Resize(ref buffer, dataLength + byteDate.Length); // //for (int i = 0; i < byteDate.Length; i++) // //{ // // buffer[dataLength + i] = byteDate[i]; // //} // logger.Info($"获取冰箱温度【{Convert.ToHexString(buffer)}】"); // fridgeSerial.Write(buffer, 0, 8); // byte[] retByte = await GetBufferByPort(fridgeSerial, 7); // logger.Info($"获取冰箱温度返回【{Convert.ToHexString(retByte)}】"); // if (retByte != null && retByte.Length >= 7) // { // var hight = retByte[3]; // var low = retByte[4]; // int iHight = Convert.ToInt32(hight << 8); // int iLow = Convert.ToInt32(retByte[4]); // temperature = Convert.ToSingle(iHight + iLow) / 10; // } // } // catch (Exception ex) // { // logger.Info($"获取冰箱温度发生异常:ex:{ex.Message}"); // } // return temperature; //} ///// ///// 设置冰箱温度 ///// ///// //public async Task SetFridgeTemperature(float temperature, int iIndex) //{ // int tpt = (int)temperature * 10; // byte Temperature = (byte)(tpt & 0xff); // try // { // //if (!FridgeOperate) // { // fridgeSerial.DiscardInBuffer(); // byte bAddress; // if (iIndex == 1) // { // bAddress = 0x01; // } // else // { // bAddress = 0x02; // } // //byte[] buffer = new byte[] { 0x01, 0x03, 0x10, 0x02, 0x00, 0x01, 0x21,0x0A }; // byte[] buffer = new byte[] { bAddress, 0x06, 0x10, 0x02, 0x00, (byte)Temperature }; // //获取数组CRC校验码 // byte[] byteDate = CRC16MODBUS.CrcModBus(buffer); // //Array.Reverse(byteDate); // int dataLength = buffer.Length; // Array.Resize(ref buffer, dataLength + byteDate.Length); // for (int i = 0; i < byteDate.Length; i++) // { // buffer[dataLength + i] = byteDate[i]; // } // logger.Info($"设置冰箱温度【{Convert.ToHexString(buffer)}】"); // fridgeSerial.Write(buffer, 0, 8); // await GetBufferByPort(fridgeSerial, 8); // } // } // catch (Exception ex) // { // logger.Info($"获取冰箱温度发生异常:ex:{ex.Message}"); // } // return temperature; //} ///// ///// 冰箱延迟报警 ///// ///// //public async Task FridgeDelayWarm(int iIndex) //{ // try // { // //if (!FridgeOperate) // { // fridgeSerial.DiscardInBuffer(); // byte bAddress; // if (iIndex == 1) // { // bAddress = 0x01; // } // else // { // bAddress = 0x02; // } // byte[] buffer = new byte[] { bAddress, 0x06, 0x10, 0xCD, 0x00, 0x01, 0xDD, 0x35 }; // //byte[] buffer = new byte[] { 0x01, 0x06, 0x10, 0xCD, 0x00, 0x01 }; // ////获取数组CRC校验码 // //byte[] byteDate = CRC16MODBUS.CrcModBus(buffer); // ////Array.Reverse(byteDate); // //int dataLength = buffer.Length; // //Array.Resize(ref buffer, dataLength + byteDate.Length); // //for (int i = 0; i < byteDate.Length; i++) // //{ // // buffer[dataLength + i] = byteDate[i]; // //} // logger.Info($"冰箱延迟报警【{Convert.ToHexString(buffer)}】"); // fridgeSerial.Write(buffer, 0, 8); // } // } // catch (Exception ex) // { // logger.Info($"获取冰箱温度发生异常:ex:{ex.Message}"); // } // //FridgeOperate = false; //} //#endregion #region 温湿度 public TemperatureHumidityInfo GetWSD() { TemperatureHumidityInfo temperatureHumidityInfo = new TemperatureHumidityInfo(); try { var master = ModbusSerialMaster.CreateRtu(wsdSerial); int no = 1; var r = master.ReadHoldingRegisters((byte)no, 00, 2); if (r != null && r.Length > 0) { var result = string.Join("", r); var result1 = result.Substring(0, 3); var result2 = result.Substring(3, 3); float temp = Int32.Parse(result2) / 10.0F; float humi = Int32.Parse(result1) / 10.0F; temperatureHumidityInfo.GroupNo = "DM5"; temperatureHumidityInfo.Temp = temp.ToString(); temperatureHumidityInfo.Humi = humi.ToString(); } //if (wsdSerial.IsOpen) //{ // wsdSerial.Close(); //} //master.Dispose(); logger.Info($"获取温湿度{string.Join("", r)}"); } catch (Exception ex) { logger.Info($"获取温湿度异常{ex.Message}"); } return temperatureHumidityInfo; } #endregion } }