You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

840 lines
34 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using Admin.Core.Common;
using Admin.Core.IService;
using Admin.Core.Model;
using Admin.Core.Model.Model_New;
using Admin.Core.Service;
using Aucma.Core.HwPLc;
using Aucma.Core.Scanner;
using log4net;
using Microsoft.Extensions.DependencyInjection;
using StackExchange.Profiling.Internal;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Threading;
using System.Threading.Tasks;
namespace Aucma.Core.Palletiz.Business
{
/// <summary>
///分垛入库业务处理
/// </summary>
public class InstoreBusiness
{
#region 单例实现
private static readonly InstoreBusiness lazy = new InstoreBusiness();
public static InstoreBusiness Instance
{
get
{
return lazy;
}
}
#endregion
#region 初始化对象
private static readonly log4net.ILog logHelper = LogManager.GetLogger(typeof(InstoreBusiness));
private readonly IBaseSpaceInfoServices _baseSpaceInfoServices;
private readonly ICodeBindingRecordServices _codeBindingServices;
private readonly IOffLineInfoServices _offLineInfoServices;
private readonly IRecordInStoreServices _recordInstoreServices;
private readonly IBaseOrderInfoServices _baseOrderInfoServices;
#endregion
#region 构造函数
public InstoreBusiness()
{
_baseSpaceInfoServices = App.ServiceProvider.GetService<IBaseSpaceInfoServices>();
_codeBindingServices = App.ServiceProvider.GetService<ICodeBindingRecordServices>();
_recordInstoreServices = App.ServiceProvider.GetService<IRecordInStoreServices>();
_offLineInfoServices = App.ServiceProvider.GetService<IOffLineInfoServices>();
_baseOrderInfoServices = App.ServiceProvider.GetService<IBaseOrderInfoServices>();
MvCodeHelper.RefreshPalletizDelegateEvent += ScannerInStore;//注册扫码器扫码后业务处理事件
}
#endregion
#region 变量定义
public readonly List<ScannerModel> allScanners = Appsettings.app<ScannerModel>("ScannerServer").ToList();
public readonly string storeCodeA = Appsettings.app("StoreInfo", "PalletizStoreCodeA");//分垛库A
public readonly string storeCodeB = Appsettings.app("StoreInfo", "PalletizStoreCodeB");//分垛库B
private static bool flagA = true;
private static bool flagB = true;
#endregion
#region 事件
#region 更新提醒信息
/// <summary>
/// 日志事件
/// </summary>
public delegate void LogInStoreInfoDelegate(string message, string color);
public static event LogInStoreInfoDelegate LogInStoreInfoDelegateEvent;
#endregion
#region 更新扫码信息
/// <summary>
/// 刷新扫码信息——图表和表格
/// </summary>
public delegate void ResherStoreInfoDelegate();
public static event ResherStoreInfoDelegate ResherStoreInfoDelegateEvent;
#endregion
#endregion
#region Test
[Obsolete("正式环境下使用ScannerInStore(string SNCode,string IP)")]
public void test()
{
// B240101 8302501416 0001 SN:16160030000000910999
Task.Run(async () =>
{
Thread.Sleep(3000);
await InStore("15100P000009E360795", "10.10.92.230");
});
}
#endregion
#region 扫码入库
/// <summary>
/// 扫码入库
/// </summary>
/// <param name="SNCode">成品码</param>
/// <param name="IP">扫码器IP</param>
public void ScannerInStore(string SNCode,string IP)
{
Task.Run(async () =>
{
Thread.Sleep(3000);
await InStore(SNCode, IP);
});
}
#endregion
#region 扫码入库处理
/// <summary>
/// 扫码入库处理
/// </summary>
/// <param name="SNCode">成品码</param>
/// <param name="scannerIp">扫码器ip</param>
/// <returns></returns>
public async Task InStore(string SNCode, string scannerIp)
{
Console.WriteLine($"上位机接收到扫码器传入的成品码:{SNCode};扫码器IP:{scannerIp}");
LogInStoreInfoDelegateEvent?.Invoke($"上位机接收到扫码器传入的成品码:{SNCode};扫码器IP:{scannerIp}","White");
bool plcResult = false;// plc下发结果
List<int> spaceNumList = new List<int>();// 下发plc的货道号
RecordInStore recordInstore = new RecordInStore();// 入库记录
try
{
// 刷新页面
List<ScannerModel> allScanners = Appsettings.app<ScannerModel>("ScannerServer").ToList();
ScannerModel model = allScanners.First(x => x.Ip == scannerIp);
Console.WriteLine($"上位机获取配置的扫码器【IP:{model.ToJson()}》名称:{model.Name}】");
LogInStoreInfoDelegateEvent?.Invoke($"上位机获取配置的扫码器【IP:{model.ToJson()}》名称:{model.Name}】","White");
//1.根据成品码找货道
List<BaseSpaceInfo> spaceList = GetSpaceBySNCode2(SNCode, recordInstore);//2024
if (spaceList == null || spaceList.Count == 0)
{
logHelper.Error("未找到匹配货道,请手动入库!");
Console.WriteLine("未找到匹配货道,请手动入库!");
// 刷新页面提示信息
LogInStoreInfoDelegateEvent?.Invoke("未找到匹配货道,请手动入库!", "Red");
return;
}
Console.WriteLine($"上位机获取配置的货道数量【{spaceList.Count}】");
// 过滤货道,找到最终需要下发的货道
BaseSpaceInfo finalSpace = FilterSpace(spaceList);
Console.WriteLine($"上位机获取需要下发的货道【货道名称:{finalSpace.SpaceName}》货道库存:{finalSpace.SpaceStock}》货道状态:{finalSpace.SpaceStatus}》货道类型:{finalSpace.SpaceType}》所属仓库:{finalSpace.StoreCode}】");
//LogInStoreInfoDelegateEvent?.Invoke($"是否为大产品:【{finalSpace.IsTwoSpace}】", "White");
//Console.WriteLine($"是否为大产品:【{finalSpace.IsTwoSpace}】");
LogInStoreInfoDelegateEvent?.Invoke($"下发的货道:【货道名称:{finalSpace.SpaceName}", "White");
// 大产品占两道
//if (finalSpace.IsTwoSpace == 1)
//{
// spaceNumList.Add(int.Parse(finalSpace.SpaceCode.Substring(5, 3)));
// spaceNumList.Add(int.Parse(GetOtherSpace(finalSpace, spaceList).SpaceCode.Substring(5, 3)));
// plcResult = SendAndAnswerPlc(scannerIp, spaceList[0].RotationRange, 1);
// recordInstore.SpaceCode = finalSpace.SpaceCode;
// recordInstore.StoreCode = finalSpace.StoreCode;
// // 更新货道信息,大产品last存objId大的储存上一个货道的主键 如货道7,8存8
// BaseSpaceInfo otherSpace = GetOtherSpace(finalSpace, spaceList);
// Console.WriteLine($"大产品入库信息:【{finalSpace.ToJson()}】【{spaceList.ToJson()}】");
// if (otherSpace != null)
// {
// UpdateSapceList(otherSpace.ObjId, spaceList);
// Console.WriteLine("更新货道信息成功!");
// LogInStoreInfoDelegateEvent?.Invoke("更新货道信息成功!", "White");
// }
//}
//else
{
// last不等于自己可以先入自己否则入另一条货道
if (IsOddNumber(finalSpace))
{
spaceNumList.Add(int.Parse(finalSpace.SpaceCode.Substring(5, 3)));
spaceNumList.Add(0);
int space =Convert.ToInt32(finalSpace.SpaceCode.Substring(finalSpace.SpaceCode.Length - 3, 3));
plcResult = SendAndAnswerPlc(scannerIp, finalSpace.RotationRange, space);
UpdateSapceList(finalSpace.ObjId, finalSpace);
Console.WriteLine("更新货道信息成功!");
LogInStoreInfoDelegateEvent?.Invoke("更新货道信息成功!", "White");
}
else
{
spaceNumList.Add(0);
spaceNumList.Add(int.Parse(finalSpace.SpaceCode.Substring(5, 3)));
int space = Convert.ToInt32(finalSpace.SpaceCode.Substring(finalSpace.SpaceCode.Length - 3, 3));
plcResult = SendAndAnswerPlc(scannerIp, finalSpace.RotationRange, space);//给PLC下传入库信号
UpdateSapceList(finalSpace.ObjId, finalSpace);
Console.WriteLine("更新货道信息成功!");
LogInStoreInfoDelegateEvent?.Invoke("更新货道信息成功!", "White");
}
}
if (plcResult == true)
{
// 更新入库记录,刷新界面
#region 添加入库记录
recordInstore.SpaceCode = finalSpace.SpaceCode;
recordInstore.StoreCode = finalSpace.StoreCode;
recordInstore.InStoreAmount = 1;
recordInstore.InStoreTime = DateTime.Now;
recordInstore.CreatedTime = DateTime.Now;
recordInstore.UpdateTime = DateTime.Now;
await _recordInstoreServices.AddAsync(recordInstore);
#endregion
}
else
{
// 界面提示手动入库
LogInStoreInfoDelegateEvent?.Invoke("界面提示手动入库!", "Red");
}
}
catch (Exception ex)
{
logHelper.Error(ex.Message.ToString());
return;
}
}
#region 根据成品码找货道
/// <summary>
/// 根据成品码找货道
/// </summary>
/// <param name="SNCode"></param>
/// <returns></returns>
private List<BaseSpaceInfo> GetSpaceBySNCode(string SNCode, RecordInStore recordInstore)
{
try
{
CodeBindingRecord bindingRecord = _codeBindingServices.FirstAsync(c => c.ProductCode.Equals(SNCode)).Result;
if (bindingRecord == null)
{
Console.WriteLine("成品下线库未有此成品下线记录!");
LogInStoreInfoDelegateEvent?.Invoke("成品下线库未有此成品下线记录!qin", "Red");
return null;
}
recordInstore.BarCodeCode = bindingRecord.BoxCode;
recordInstore.MaterialCode = bindingRecord.BoxCode;
recordInstore.MaterialType = bindingRecord.BoxCode.Substring(7, 10);
recordInstore.MaterialName = bindingRecord.BoxName;
string mType = bindingRecord.BoxCode.Substring(7, 10);
List<BaseSpaceInfo> bsInfo = _baseSpaceInfoServices.Query(s => (s.MaterialType.Equals(mType) && (s.StoreCode.Equals(storeCodeA)) || s.StoreCode.Equals(storeCodeB)));
if (bsInfo.Count > 0)
return bsInfo.OrderBy(x => x.ObjId).ToList();
else
return null;
}
catch (Exception ex)
{
Console.WriteLine("成品下线库未有此成品下线记录!");
LogInStoreInfoDelegateEvent?.Invoke("成品下线库未有此成品下线记录!qin", "Red");
logHelper.Error(ex.Message.ToString());
Console.WriteLine(ex.Message.ToString());
return null;
}
}
/// <summary>
/// 根据成品码找货道_临时 2024-03-11
/// </summary>
/// <param name="SNCode"></param>
/// <returns></returns>
private List<BaseSpaceInfo> GetSpaceBySNCode2(string SNCode, RecordInStore recordInstore)
{
try
{
OffLineInfo record = _offLineInfoServices.FirstAsync(c => c.ProductSNCode.Equals(SNCode)).Result;
if (record == null)
{
Console.WriteLine("成品下线库未有此成品下线记录!");
return null;
}
Console.WriteLine(record.ProductOrderNo);
BaseOrderInfo baseOrderInfo =_baseOrderInfoServices.FirstAsync(d=>"0000"+d.OrderCode== record.ProductOrderNo).Result ;
recordInstore.BarCodeCode = record.BoxCode;
recordInstore.MaterialCode = baseOrderInfo.MaterialCode;
recordInstore.MaterialType = baseOrderInfo.MaterialCode;
recordInstore.MaterialName = baseOrderInfo.MaterialName;
string mType = baseOrderInfo.MaterialCode;
List<BaseSpaceInfo> bsInfo = _baseSpaceInfoServices.Query(s => (s.MaterialType.Equals(mType) && (s.StoreCode.Equals(storeCodeA))));
if (bsInfo.Count > 0)
return bsInfo.OrderBy(x => x.ObjId).ToList();
else
return null;
}
catch (Exception ex)
{
Console.WriteLine("成品下线库未有此成品下线记录!");
//LogInStoreInfoDelegateEvent?.Invoke("成品下线库查询成品下线记录异常!请联系当班负责人处理", "Red");
logHelper.Error(ex.Message.ToString());
Console.WriteLine($"成品下线库未有此成品下线记录!{ex.Message.ToString()}");
return null;
}
}
#endregion
private BaseSpaceInfo FilterSpace(List<BaseSpaceInfo> spaceInfos)
{
if (spaceInfos == null|| spaceInfos.Count==0) return null;
List<BaseSpaceInfo> baseSpaceInfoList = spaceInfos.OrderBy(d => d.UpdatedTime).ToList();
BaseSpaceInfo spaceInfo = baseSpaceInfoList.First();
if (spaceInfo!=null || string.IsNullOrEmpty(spaceInfo.LastSpace))
{
return spaceInfo;
}
return null;
}
/// <summary>
/// 大产品占据两条货道,根据一条货道找到另一条货道
/// </summary>
/// <param name="spaceInfo"></param>
private BaseSpaceInfo GetOtherSpace(BaseSpaceInfo spaceInfo, List<BaseSpaceInfo> spaceList)
{
try
{
// 找到当前货道匹配的另一条货道
int num = int.Parse(spaceInfo.SpaceCode.Substring(5, 3));
string otherSpaceCode = string.Empty;
if (num % 2 == 0) // 偶数如7,8当前8找7
{
otherSpaceCode = spaceInfo.SpaceCode.Substring(0, 5) + (num - 1).ToString("D3");
}
else
{
otherSpaceCode = spaceInfo.SpaceCode.Substring(0, 5) + (num + 1).ToString("D3");
}
spaceList = spaceList.Where(s => s.SpaceCode.Equals(otherSpaceCode)).ToList();
if (spaceList.Count > 0)
{
return spaceList[0];
}
else
{
return null;
}
}
catch (Exception ex)
{
logHelper.Error(ex.Message.ToString());
Console.WriteLine($"大产品根据一条货道找到另一条货道异常:{ex.Message}");
return null;
}
}
/// <summary>
/// 判断货道编号是否为奇数
/// </summary>
/// <param name="space"></param>
/// <returns></returns>
private bool IsOddNumber(BaseSpaceInfo space)
{
int num = int.Parse(space.SpaceCode.Substring(5, 3));
if (num % 2 == 0)
{
return false;
}
else
{
return true;
}
}
/// <summary>
/// 将该物料的所有货道列表的last修改为上次入库货道objId
/// </summary>
/// <param name="objId"></param>
/// <param name="spaceList"></param>
/// <returns></returns>
private bool UpdateSapceList(int objId, BaseSpaceInfo spaceList)
{
//foreach (BaseSpaceInfo space in spaceList)
//{
// space.LastSpace = objId.ToString();
// space.UpdatedTime =DateTime.Now;
//}
spaceList.LastSpace = objId.ToString();
spaceList.UpdatedTime = DateTime.Now;
return _baseSpaceInfoServices.UpdateAsync(spaceList).Result;
}
#endregion
#region plc信号下发
#region 下发plc入库信号
/// <summary>
/// 下发plc入库信号
/// </summary>
/// <param name="scannerIp">扫码器ip</param>
/// <param name="range">转向角度</param>
/// <param name="spaceNum">货道号</param>
/// <returns></returns>
private bool SendAndAnswerPlc(string scannerIp, int range,int spaceNum)
{
bool result = false;
try
{
PlcModel obj = GetPlcByScanner(scannerIp);
if (obj != null&& obj.plc.IsConnected)
{
if (SendPlc(obj, range, spaceNum))
{
return true;
}
}
else
{
logHelper.Error("plc未连接");
return false;
}
return result;
}
catch (Exception ex)
{
logHelper.Error(ex.Message.ToString());
return result;
}
}
#endregion
#region 下发plc信号
/// <summary>
/// 下发plc信号
/// </summary>
/// <param name="obj"></param>
/// <param name="range">转向</param>
/// <param name="spaceNum">库数量</param>
/// <returns></returns>
private bool SendPlc(PlcModel obj, int range,int spaceNum)
{
try
{
bool result = false;
DateTime targetTime = DateTime.Now.AddSeconds(8);
int i= 0;
while (i<3)
{
if (obj.plc.IsConnected)
{
Console.WriteLine($"是否可以下发:【{obj.plc.ReadBool("B1000")}】");
if (obj.plc.ReadBool("B1000"))//如果为true 则可以下发 任务
{
// 应答字允许下发
int storeNum = GetStoreNum(obj, spaceNum);
Console.WriteLine($"读取当前货道数量:【{storeNum}】");
//if (storeNum == 1)
{
//obj.plc.WriteInt16("D7010", range.ToString());//旋转角度1=》90 2=>反转90 D2 1正转 2反转
//obj.plc.WriteInt16("D29", spaceNum.ToString()); //货道号
//obj.plc.WriteInt16("B1001", "1");//发送完成信号
obj.plc.WriteInt16("D29", spaceNum.ToString());//货道号
if (range==0)
{
range = 3;
}
if (range == 90)
{
range = 1;
}
if (range == -90)
{
range = 2;
}
if (range == -180)
{
range = 4;
}
obj.plc.WriteInt16("D2", range.ToString());//角度 1正转90 2反转90 3不转 4 反转180
obj.plc.WriteInt16("B1001", "1");//发送完成信号
Console.WriteLine($"plc信号货道信号下发成功!【货道号:{spaceNum}");
result = true;
break;
}
}
}
else
{
Console.WriteLine($"plc未连接");
}
Thread.Sleep(100);
i++;
}
return result;
}
catch (Exception ex)
{
logHelper.Error(ex.Message);
return false;
}
}
public int GetStoreNum(PlcModel obj, int spaceNum)
{
int storeNum = 0;
switch (spaceNum)
{
case 1:
storeNum = obj.plc.ReadInt16("D1001");
break;
case 2:
storeNum = obj.plc.ReadInt16("D1002");
break;
case 3:
storeNum = obj.plc.ReadInt16("D1003");
break;
case 4:
storeNum = obj.plc.ReadInt16("D1004");
break;
case 5:
storeNum = obj.plc.ReadInt16("D1005");
break;
case 6:
storeNum = obj.plc.ReadInt16("D1006");
break;
case 7:
storeNum = obj.plc.ReadInt16("D1007");
break;
case 8:
storeNum = obj.plc.ReadInt16("D1008");
break;
case 9:
storeNum = obj.plc.ReadInt16("D1009");
break;
case 10:
storeNum = obj.plc.ReadInt16("D1010");
break;
case 11:
storeNum = obj.plc.ReadInt16("D1011");
break;
case 12:
storeNum = obj.plc.ReadInt16("D1012");
break;
case 13:
storeNum = obj.plc.ReadInt16("D1013");
break;
case 14:
storeNum = obj.plc.ReadInt16("D1014");
break;
default:
break;
}
return storeNum;
}
#endregion
#region 等待plc信号反馈
/// <summary>
/// 等待plc信号反馈
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
private bool WaitAnswerPlc(PlcModel obj)
{
try
{
bool result = false;
DateTime targetTime = DateTime.Now.AddSeconds(8);
while (true)
{
if (DateTime.Now > targetTime) // plc超最大时限无反馈
{
logHelper.Error("等待plc放行反馈信号超时");
Console.WriteLine("等待plc放行反馈信号超时");
return false;
}
// 应答字允许下发
if (obj.plc.ReadInt32("D102") == 2)
{
result = true;
Console.WriteLine("下发成功!");
break;
}
Thread.Sleep(500);
}
return result;
}
catch (Exception ex)
{
logHelper.Error(ex.Message.ToString());
return false;
}
}
#endregion
#region 根据扫码器ip确定是属于哪个plc
/// <summary>
/// 根据扫码器ip确定是属于哪个plc
/// </summary>
/// <param name="scannerIp"></param>
/// <returns></returns>
private PlcModel GetPlcByScanner(string scannerIp)
{
//PlcModel obj = null;
//ScannerModel model = allScanners.FirstOrDefault(x => x.Ip == scannerIp);
//if (model.Id < 3)
//{
// obj = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("InStoreAPlc"));
//}
//else
//{
// obj = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("InStoreBPlc"));
//}
PlcModel obj = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("InStoreAPlc"));
return obj;
}
#endregion
#endregion
#region 写入货道号给PLC数据
/// <summary>
/// 手动写入PLC数据
/// </summary>
/// <returns></returns>
public static bool WritePlc(Models.StackInfoModel tempStackInfo)
{
var obj = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("InStorePlc"));
//写入PLC
if (obj.plc.IsConnected)
{
//1、判断是否为大产品、占用两个货道 上位机两条道设置为相同型号
if (tempStackInfo.IsLargeProducts)
{
obj.plc.WriteInt16("D7000", tempStackInfo.BinNo.ToString());//写入货道
}
else
{
//判断入库货道
if (tempStackInfo.BinNo / 2 == 0)
{
obj.plc.WriteInt16("D7000", tempStackInfo.BinNo.ToString());//写入货道
obj.plc.WriteInt16("D7100", "0");//写入货道
}
else
{
obj.plc.WriteInt16("D7000", "0");//写入货道
obj.plc.WriteInt16("D7100", tempStackInfo.BinNo.ToString());//写入货道
}
}
obj.plc.WriteInt16("D7020", "1");//同时写入应答字
Console.WriteLine("手动写入PLC成功");
do
{
#region 1号区域码垛——A
int responseWord1 = obj.plc.ReadInt16("D7020");//读取1号区域码垛 等待应答字回去
Console.WriteLine($"获取应答信号:{responseWord1}");
if (responseWord1 == 2)
{
//清空货道
obj.plc.WriteInt16("D7000", "0");
obj.plc.WriteInt16("D7100", "0");
flagA = false;
}
#endregion
} while (flagA);
return true;
}
else
{
LogInStoreInfoDelegateEvent?.Invoke("PLC未连接!", "Red");
return false;
}
//更新货道
}
#endregion
#region 人工操作入库
/// <summary>
/// 临时写入入库
/// </summary>
/// <param name="freightLaneNumber">货道号</param>
/// <param name="range">转向: 1正转 2反转3不转</param>
/// <returns></returns>
public static bool TempWritePlc(int freightLaneNumber, int range)
{
try
{
var obj = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("InStoreAPlc"));
//写入PLC
bool flag = true;
do
{
if (obj == null)
{
return false;
}
if (obj.plc.IsConnected)
{
bool isDown = false;
int i = 0;
do
{
isDown = obj.plc.ReadBool("B1000");
if (isDown)
{
Console.WriteLine($"[{DateTime.Now}] 当前下发信号为:{isDown}");
LogInStoreInfoDelegateEvent?.Invoke($"[{DateTime.Now}] 当前下发信号为:{isDown}", "White");
break;
}
else
{
Console.WriteLine($"[{DateTime.Now}] 当前下发信号为:{isDown},不可以下发");
LogInStoreInfoDelegateEvent?.Invoke($"[{DateTime.Now}] 当前下发信号为:{isDown}", "Red");
}
Console.WriteLine($"[{DateTime.Now}] 当前下发信号为:{isDown}");
Thread.Sleep(1000);
i++;
} while (i < 3);
if (isDown == false)
{
Console.WriteLine($"[{DateTime.Now}] 下发失败,当前下发信号为:{isDown},请稍等后重试!");
LogInStoreInfoDelegateEvent?.Invoke($"[{DateTime.Now}] 下发失败,当前下发信号为:{isDown},请稍等后重试!", "Red");
return false;
}
LogInStoreInfoDelegateEvent?.Invoke($"[{DateTime.Now}] 开始下发PLC》货道号{freightLaneNumber}》角度(1正转 2反转 3不转){range}", "Red");
Console.WriteLine($"[{DateTime.Now}] 开始下发PLC》货道号{freightLaneNumber}》角度(1正转 2反转 3不转){range}");
if (isDown)
{
obj.plc.WriteInt16("D29", freightLaneNumber.ToString());//货道号
obj.plc.WriteInt16("D2", range.ToString());//角度 1正转90 2反转90 3不转 4 反转180
obj.plc.WriteInt16("B1001", "1");//发送完成信号
Console.WriteLine($"[{DateTime.Now}] 下发PLC成功");
LogInStoreInfoDelegateEvent?.Invoke($"[{DateTime.Now}] 下发PLC成功", "Red");
//将手动信息保存到库中设置000000000未手动设置的成品码
Thread.Sleep(1000);
isDown = obj.plc.ReadBool("B1000");
if (isDown)
{
Console.WriteLine($"[{DateTime.Now}] 当前下发信号为:{isDown}");
}
else
{
Console.WriteLine($"[{DateTime.Now}] 当前下发信号为:{isDown}");
}
return true;
}
flag = false;
}
else
{
flag = true;
}
} while (flag);
return true;
}
catch (Exception ex)
{
Console.WriteLine($"[{DateTime.Now}] 手动下发任务异常:{ex.Message}");
LogInStoreInfoDelegateEvent?.Invoke($"[{DateTime.Now}] 手动下发任务异常:{ex.Message}", "Red");
return false;
}
}
#endregion
public bool WriteIF(PlcModel obj, string space)
{
bool flag = true;
switch (space)
{
case "FD01_001":
flag = obj.plc.ReadBool("D1001");
break;
case "FD01_002":
flag = obj.plc.ReadBool("D1001");
break;
case "FD01_003":
flag = obj.plc.ReadBool("D1001");
break;
case "FD01_004":
flag = obj.plc.ReadBool("D1001");
break;
case "FD01_005":
flag = obj.plc.ReadBool("D1001");
break;
case "FD01_006":
flag = obj.plc.ReadBool("D1001");
break;
case "FD01_007":
flag = obj.plc.ReadBool("D1001");
break;
case "FD01_008":
flag = obj.plc.ReadBool("D1001");
break;
case "FD01_009":
flag = obj.plc.ReadBool("D1001");
break;
case "FD01_010":
flag = obj.plc.ReadBool("D1001");
break;
case "FD01_011":
flag = obj.plc.ReadBool("D1001");
break;
case "FD01_012":
flag = obj.plc.ReadBool("D1001");
break;
case "FD01_013":
flag = obj.plc.ReadBool("D1001");
break;
case "FD01_014":
flag = obj.plc.ReadBool("D1001");
break;
default:
break;
}
return flag;
}
}
}