| | |
| | | //"ConnectionString": "PORT=5432;DATABASE=xxx;HOST=localhost;PASSWORD=xxx;USER ID=xxx", // PostgreSQL 库连接字符串 |
| | | //"ConnectionString": "Server=localhost;Database=xxx;Uid=xxx;Pwd=xxx;SslMode=None;", // MySql 库连接字符串", |
| | | //"ConnectionString": "User Id=xxx; Password=xxx; Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)))", // Oracle 库连接字符串 |
| | | "ConnectionString": "Server=localhost;Database=WCS_JC30;User Id=sa;Password=sql2022;", // SqlServer 库连接字符串 |
| | | "ConnectionString": "Server=172.18.3.206;Database=WCS_JC30;User Id=sa;Password=sql2024!@#;", // SqlServer 库连接字符串 |
| | | |
| | | |
| | | //"SlaveConnectionConfigs": [ // 读写分离/主从 |
| | |
| | | }; |
| | | _db.Insertable(modTaskMonitor).ExecuteCommand(); |
| | | HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | //写入光幕0 |
| | | Task.Run(() => |
| | | { |
| | | var modDevice = PLCTaskAction.plcDevices.FirstOrDefault(s => s.PlcId == modPlc.Id && s.Level == DeviceLevelEnum.DB); |
| | |
| | | HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | }); |
| | | |
| | | //向码垛机器人写取托完成信号 |
| | | modDevice = PLCTaskAction.plcDevices.FirstOrDefault(s => s.PlcId == modPlc.Id && s.Level == DeviceLevelEnum.Station); |
| | | res = modConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.PlcPos, "0"); |
| | | modTaskMonitor = new WcsTaskMonitor() |
| | |
| | | HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | modConn.Close(); |
| | | } |
| | | if (modTask.StartLocate == AGVStaionEnum.A1.ToString()) |
| | | //起始工位是提升机取货工位 |
| | | if (modTask.StartLocate == AGVStaionEnum.A2.ToString()) |
| | | { |
| | | var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Type == PLCTypeEnum.ConveyorLine); |
| | | var modConn = new PLCUtil(modPlc); |
| | |
| | | //如果拉托盘去成品工位,先检查有没有缺托 |
| | | if (modTask.StartLocate.Substring(0, 1) == "D" && modTask.EndLocate.Substring(0, 1) == "B") |
| | | { |
| | | //判断目标位置是拆托机的任务有没有,有就跳过拆托机到成品工位的任务 |
| | | if (listTask.Any(s => s.EndLocate.Substring(0, 1) == "D")) |
| | | continue; |
| | | } |
| | | //如果目的工位是原料仓,先检查原料仓储位状态 |
| | | if (modTask.EndLocate == AGVStaionEnum.F1.ToString()) |
| | | { |
| | | if (_sysConfigService.GetConfigValue<bool>("cache_Materal").Result) |
| | |
| | | // if (!_sysConfigService.GetConfigValue<bool>("cache_Materal").Result) |
| | | // continue; |
| | | //} |
| | | |
| | | //如果起始工位是拆托机 |
| | | if (modTask.StartLocate == AGVStaionEnum.D1.ToString()) |
| | | { |
| | | //获取叠拆托机IP |
| | | var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Type == PLCTypeEnum.PalletMachine); |
| | | //获取叠拆托机工位 |
| | | var modDevice2 = PLCTaskAction.plcDevices.FirstOrDefault(s => s.PlcId == modPlc.Id && s.Text == "拆托机"); |
| | | //打开连接 |
| | | var modConn = new PLCUtil(modPlc); |
| | | //是否缺托信号 |
| | | //是否允许取托信号 |
| | | var modPos = PLCTaskAction.plcPositions.FirstOrDefault(s => s.DeviceId == modDevice2.Id && s.Text == "允许取托"); |
| | | var (result, value) = modConn.GetPlcDBValue(modPos.PosType, modDevice2.DbNumber, modPos.PlcPos); |
| | | if (result.IsSucceed) |
| | |
| | | } |
| | | else |
| | | { |
| | | //不允许取托,判断是否拆托机准备完成 |
| | | modPos = PLCTaskAction.plcPositions.FirstOrDefault(s => s.DeviceId == modDevice2.Id && s.Text == "准备完成"); |
| | | (result, value) = modConn.GetPlcDBValue(modPos.PosType, modDevice2.DbNumber, modPos.PlcPos); |
| | | if (!value) |
| | |
| | | continue; |
| | | } |
| | | } |
| | | //如果目的工位是提升机放货工位,先检查有没有托盘线的任务 |
| | | if (modTask.EndLocate == AGVStaionEnum.A1.ToString()) |
| | | { |
| | | if (_db.Queryable<WcsTask>().Where(s => s.Type == PLCTypeEnum.ConveyorLine && s.Status == TaskStatusEnum.Doing).Any()) |
| | |
| | | using DocumentFormat.OpenXml.Bibliography; |
| | | using DocumentFormat.OpenXml.Drawing; |
| | | using Elastic.Clients.Elasticsearch; |
| | | using Furion.Logging; |
| | | using IoTClient; |
| | | using IoTClient.Clients.Modbus; |
| | | using IoTClient.Clients.PLC; |
| | |
| | | } |
| | | return _client.BatchWrite(addresses); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 循环写入PLC值(并读取值判断和写入的值是否一致,写入控制字不能用此方法) |
| | | /// </summary> |
| | | public IoTClient.Result SetPlcDBValueRepeat(PLCDataTypeEnum PosType, string DbNumber, string Pos, string Value) |
| | | { |
| | | IoTClient.Result _result = new IoTClient.Result(); |
| | | |
| | | int setCount = 0;//写入次数 |
| | | while (setCount < 5) |
| | | { |
| | | string address; |
| | | if (DbNumber.StartsWith("DB")) |
| | | address = DbNumber + "." + Pos; |
| | | else |
| | | address = DbNumber + Pos; |
| | | _result = this.SetPlcDBValue(PosType, address, Value);//写入值 |
| | | |
| | | //累计写入次数 |
| | | setCount++; |
| | | |
| | | if (_result.IsSucceed) |
| | | { |
| | | //读取写入的值 |
| | | var (res, val) = GetPlcDBValue(PosType, DbNumber, Pos); |
| | | if (val.ToString() == Value) |
| | | { |
| | | //读取的值和写入的值一致,直接跳出循环 |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | //写入日志 |
| | | Log.Information($"66666666写入PLC,DbNumber:{DbNumber},Pos:{Pos},Value:{Value},setCount:{setCount}"); |
| | | |
| | | return _result; |
| | | } |
| | | |
| | | |
| | | } |