using System;
using System.Linq;
using EasyModbus;
using HH.WCS.Mobox3.RiDong.apiMethod;
using HH.WCS.Mobox3.RiDong.models;
using HH.WCS.Mobox3.RiDong.util;
using S7.Net.Types;
using Task = HH.WCS.Mobox3.RiDong.models.Task;
namespace HH.WCS.Mobox3.RiDong.generalMethod;
///
/// 线程方法
///
public static class ThreadMenthod
{
///
/// 根据作业创建对应任务
///
public static void CreateTask()
{
// 获取所有等待中的作业
var operations = AdoSqlMethod.QueryList(p => p.N_B_STATE == 0);
foreach (var operation in operations)
{
TaskHelper.CreateTask(operation);
}
}
///
/// 根据配盘明细创建出库任务
///
public static void CreateOutTaskFromDistributionCntrDetail()
{
var tnDistributionCntrs = AdoSqlMethod
.QueryList(p => p.N_B_STATE == 1);
TaskHelper.CreateOutTaskFromDistributionCntrDetail(tnDistributionCntrs);
}
///
/// 出库任务推送(AGV)
///
public static void DispatchFromAGV()
{
// 查询中间表数据
var conveyorLinesInfo = AdoSqlMethod.QueryFirst(p=>p.PURPOSE == "门禁");
if (conveyorLinesInfo.ACCESS == 0)
{
// 获取所有出库的agv任务
var tasks = AdoSqlMethod
.QueryList(p =>
p.N_B_STATE == 0 && p.N_SCHEDULE_TYPE == 2 &&
(p.N_TYPE == 2 || p.N_TYPE == 4 || p.N_TYPE == 5 || p.N_TYPE == 6 || p.N_TYPE == 7));
// 排序
tasks = tasks.OrderBy(p=>p.N_ROADWAY).ThenBy(p=>p.T_CREATE).ToList();
foreach (var task in tasks)
{
// 判断有没有已推送的任务,有的话不推送,没有就推送
// if(AdoSqlMethod.QueryCount(p=>(p.N_B_STATE == 1 || p.N_B_STATE == 2) && p.N_SCHEDULE_TYPE == 2 ))
LogHelper.Info($"当前推送任务在第{task.N_ROADWAY}巷道,任务编号为{task.S_CODE}");
// 出库AGV不做限制直接推送
if (TaskHelper.SendTaskFromAGV(task))
{
task.N_B_STATE = 1;
task.S_B_STATE = "已推送";
task.T_MODIFY = DateTime.Now;
AdoSqlMethod.UpdateFirst(task, p => new { p.N_B_STATE, p.S_B_STATE, p.T_MODIFY });
}
}
}
}
///
/// 创建出库单(获取MaterialOut文件)
///
public static void CreateOutboundOrderFromMaterialOut()
{
// 获取所有的MaterialOut数据
var materialOuts = AdoSqlMethod.QueryList(p => p.S_CREATE_OK == 0);
OutWareHouseService.CreateOutboundOrderFromMaterialOut(materialOuts);
}
///
/// 创建出库单(获取DoOut文件)
///
public static void CreateOutboundOrderFromDoOut()
{
// 获取所有的DoOut数据
var doOuts = AdoSqlMethod.QueryList(p => p.S_CREATE_OK == 0);
OutWareHouseService.CreateOutboundOrderFromDoOut(doOuts);
}
///
/// 完成作业
///
public static void AccomplishOperation()
{
var operations = AdoSqlMethod.QueryList(p => p.N_B_STATE == 1);
foreach (var operation in operations)
{
// 判断该任务是否全部完成
var tasks = AdoSqlMethod.QueryList(p => p.S_OP_CODE == operation.S_CODE);
if (tasks.Count == tasks.Count(p => p.N_B_STATE == 3))
{
operation.N_B_STATE = 2;
operation.S_B_STATE = "完成";
operation.T_MODIFY = DateTime.Now;
operation.T_END_TIME = DateTime.Now;
AdoSqlMethod.UpdateFirst(operation,
p => new { p.N_B_STATE, p.S_B_STATE, p.T_MODIFY, p.T_END_TIME });
}
else if (tasks.Count(p => p.N_B_STATE == 4) > 0)
{
operation.N_B_STATE = 3;
operation.S_B_STATE = "错误";
operation.T_MODIFY = DateTime.Now;
operation.T_END_TIME = DateTime.Now;
AdoSqlMethod.UpdateFirst(operation,
p => new { p.N_B_STATE, p.S_B_STATE, p.T_MODIFY, p.T_END_TIME });
}
}
}
///
/// 读取使用到的线体并执行对应的逻辑关系
///
public static void ReadConveyorlinesMessage()
{
var conveyorlinesInfos =
AdoSqlMethod.QueryList(p => p.ENABLE == 1);
foreach (var conveyorlinesInfo in conveyorlinesInfos)
{
PipeLineHelper.ReadConveyorlinesMessage(conveyorlinesInfo);
}
}
public static void ModbusHelper()
{
// 要写入的字符串
string inputString = "你好,Modbus TCP!";
// 将字符串编码为字节(GB2312)
byte[] byteData = System.Text.Encoding.GetEncoding("GB2312").GetBytes(inputString);
// 计算寄存器数量及寄存器值(寄存器是16位的,每个寄存器可以存储2个字节)
int numberOfRegisters = (int)Math.Ceiling((double)byteData.Length / 2);
int[] registerValues = new Int32[numberOfRegisters];
for (int i = 0; i < byteData.Length; i++)
{
if (i % 2 == 0) // 每两个字节组成一个寄存器
{
if (i + 1 < byteData.Length)
{
// 高字节在前
registerValues[i / 2] = (ushort)((byteData[i] << 8) | byteData[i + 1]);
}
else
{
// 填充低字节为 0
registerValues[i / 2] = (ushort)(byteData[i] << 8);
}
}
}
// 创建 Modbus 客户端
ModbusClient client = new ModbusClient("169.93.160.60", 5003);
try
{
// 连接到 Modbus 服务器
client.Connect();
// 写入寄存器,寄存器地址需要减去 1,因为 EasyModbus 使用 0 基址
client.WriteMultipleRegisters(40001, registerValues);
Console.WriteLine("Data written successfully.");
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.Message);
}
}
}