feat - PLC业务开发完成

master
SoulStar 2 months ago
parent 18f73cd51a
commit 5b7e5eee6c

@ -47,13 +47,13 @@ namespace Sln.Iot.Business
//成功验证 //成功验证
if (trayBytesResult.IsSuccess && pordBytesResult.IsSuccess) if (trayBytesResult.IsSuccess && pordBytesResult.IsSuccess)
{ {
//转换托盘 //转换托盘
string traycode = Encoding.ASCII.GetString(trayBytesResult.Content); string traycode = Encoding.ASCII.GetString(trayBytesResult.Content);
byte[] prodBytes = trayBytesResult.Content; byte[] prodBytes = trayBytesResult.Content;
string[] prodcode = new string[6]; string[] prodcode = new string[6];
//分割转换产品码 //分割转换产品码
for (int i = 0; i < 5; i++) for (int i = 0; i < 6; i++)
{ {
prodcode[i] = Encoding.ASCII.GetString(prodBytes[(i * 20)..(i * 20 + 20)]); prodcode[i] = Encoding.ASCII.GetString(prodBytes[(i * 20)..(i * 20 + 20)]);
} }
@ -61,13 +61,13 @@ namespace Sln.Iot.Business
bool res = TrayBindingService.Instance.TrayBindingRefresh(traycode, prodcode); bool res = TrayBindingService.Instance.TrayBindingRefresh(traycode, prodcode);
if (!res) if (!res)
{ {
_log.Error("上料提升机数据处理流程异常"); _log.Error("上料提升机数据库写入异常");
} }
//写入完成信号 //写入完成信号
res = _plc.PlcWrite(_plc.DeltaInstance3, "D500", 1002, DataTypeEnum.UInt16).IsSuccess; res = _plc.PlcWrite(_plc.DeltaInstance3, "D500", 1002, DataTypeEnum.UInt16).IsSuccess;
if (!res) if (!res)
{ {
_log.Error("上料提升机写入完成信号异常"); _log.Error("上料提升机PLC写入完成信号异常");
} }
} }
//流程完成 //流程完成
@ -75,7 +75,7 @@ namespace Sln.Iot.Business
} }
else else
{ {
_log.Error("上料提升机读取信号异常"); _log.Error("上料提升机PLC读取信号异常");
} }
} }
} }

@ -1,5 +1,6 @@
using HslCommunication; using HslCommunication;
using Sln.Iot.PLC; using Sln.Iot.PLC;
using Sln.Iot.Repository.service;
using Sln.Iot.Serilog; using Sln.Iot.Serilog;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -23,27 +24,53 @@ namespace Sln.Iot.Business
} }
/// <summary> /// <summary>
/// RFID02上料提升机数据处理流程业务刷新 /// RFID02胶机1真空箱内数据处理流程
/// </summary> /// </summary>
/// <param name="state"></param> /// <param name="state"></param>
public void TimerCallback(object? state) public void TimerCallback(object? state)
{ {
// 定时任务逻辑 // 定时任务逻辑
OperateResult<short> signalRes = _plc.ReadInt16(_plc.DeltaInstance1, "D500"); //读取信号
OperateResult<short> signalRes = _plc.ReadInt16(_plc.DeltaInstance1, "D800");
//成功验证
if (signalRes.IsSuccess) if (signalRes.IsSuccess)
{ {
short signalValue = signalRes.Content; short signalValue = signalRes.Content;
if(signalValue == 1001) //如果有读取信号
if (signalValue == 2001)
{ {
OperateResult<byte[]> trayBytesResult = _plc.ReadBytes(_plc.DeltaInstance1, "D5000", 10); //读取托盘码
OperateResult<byte[]> pordBytesResult = _plc.ReadBytes(_plc.DeltaInstance1, "D8000", 60); OperateResult<byte[]> trayBytesResult = _plc.ReadBytes(_plc.DeltaInstance1, "D5000", 20);
if(trayBytesResult.IsSuccess && pordBytesResult.IsSuccess) //成功验证
if (trayBytesResult.IsSuccess)
{ {
string traycode = "abcdefg"; //转换托盘码
string prodcode = "1234567890"; string traycode = Encoding.ASCII.GetString(trayBytesResult.Content);
//sql更新
//待开发 记录数据
bool res = false;
if (!res)
{
_log.Error("胶机1真空箱内数据库写入异常");
}
//写入完成信号
res = _plc.PlcWrite(_plc.DeltaInstance1, "D800", 2002, DataTypeEnum.UInt16).IsSuccess;
if (!res)
{
_log.Error("胶机1真空箱内写入完成信号异常");
}
} }
//流程完成
} }
} }
else
{
_log.Error("胶机1真空箱内PLC读取信号异常");
}
} }
} }
} }

@ -0,0 +1,73 @@
using HslCommunication;
using Sln.Iot.PLC;
using Sln.Iot.Repository.service;
using Sln.Iot.Serilog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sln.Iot.Business
{
public class RFID03Business
{
private Timer _timer;
private readonly PLCConnect _plc;
private readonly SerilogHelper _log;
public RFID03Business()
{
_timer = new Timer(TimerCallback, null, 0, 5000);
}
/// <summary>
/// RFID03胶机1真空箱外数据处理流程
/// </summary>
/// <param name="state"></param>
public void TimerCallback(object? state)
{
// 定时任务逻辑
//读取信号
OperateResult<short> signalRes = _plc.ReadInt16(_plc.DeltaInstance1, "D802");
//成功验证
if (signalRes.IsSuccess)
{
short signalValue = signalRes.Content;
//如果有读取信号
if (signalValue == 3001)
{
//读取托盘码
OperateResult<byte[]> trayBytesResult = _plc.ReadBytes(_plc.DeltaInstance1, "D5020", 20);
//成功验证
if (trayBytesResult.IsSuccess)
{
//转换托盘码
string traycode = Encoding.ASCII.GetString(trayBytesResult.Content);
//sql更新
bool res = TrayBindingService.Instance.UpDateTime(DateTime.Now.ToString(), traycode, "1");
if (!res)
{
_log.Error("胶机1真空箱外数据库写入异常");
}
//写入完成信号
res = _plc.PlcWrite(_plc.DeltaInstance1, "D802", 3002, DataTypeEnum.UInt16).IsSuccess;
if (!res)
{
_log.Error("胶机1真空箱外写入完成信号异常");
}
}
//流程完成
}
}
else
{
_log.Error("胶机1真空箱外PLC读取信号异常");
}
}
}
}

@ -0,0 +1,111 @@
using HslCommunication;
using Sln.Iot.PLC;
using Sln.Iot.Repository.service;
using Sln.Iot.Serilog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Runtime.CompilerServices.RuntimeHelpers;
namespace Sln.Iot.Business
{
public class RFID04Business
{
private Timer _timer;
private readonly PLCConnect _plc;
private readonly SerilogHelper _log;
public RFID04Business()
{
_timer = new Timer(TimerCallback, null, 0, 5000);
}
/// <summary>
/// RFID02胶机1真空箱数据处理流程
/// </summary>
/// <param name="state"></param>
public void TimerCallback(object? state)
{
// 定时任务逻辑
//读取信号
OperateResult<short> signalRes = _plc.ReadInt16(_plc.DeltaInstance2, "D800");
//成功验证
if (signalRes.IsSuccess)
{
short signalValue = signalRes.Content;
//如果有读取信号
if (signalValue == 4001)
{
//读取托盘码和产品码
OperateResult<byte[]> trayBytesResult = _plc.ReadBytes(_plc.DeltaInstance2, "D5000", 20);
//成功验证
if (trayBytesResult.IsSuccess)
{
//转换托盘吗
string traycode = Encoding.ASCII.GetString(trayBytesResult.Content);
//sql更新
bool res = TrayBindingService.Instance.UpDateTime(DateTime.Now.ToString(), traycode, "2");
if (!res)
{
_log.Error("胶机2真空箱前开始时间数据库写入异常");
}
//写入完成信号
res = _plc.PlcWrite(_plc.DeltaInstance2, "D800", 4002, DataTypeEnum.UInt16).IsSuccess;
if (!res)
{
_log.Error("胶机2真空箱前开始时间PLC写入完成信号异常");
}
}
//流程完成
}
if(signalValue == 4003)
{
//读取托盘码
OperateResult<byte[]> trayBytesResult = _plc.ReadBytes(_plc.DeltaInstance2, "D5000", 20);
//成功验证
if (trayBytesResult.IsSuccess)
{
//转换托盘吗
string traycode = Encoding.ASCII.GetString(trayBytesResult.Content);
//sql更新
string nowTime = DateTime.Now.ToString();
bool res = TrayBindingService.Instance.UpDateTime(nowTime, traycode, "3");
if (!res)
{
_log.Error("胶机2真空箱前时间计算数据库写入异常");
}
//取之前存的时间
string time2 = TrayBindingService.Instance.GetTime2ByTrayCode(traycode);
//计算时间差
TimeSpan span = Convert.ToDateTime(time2) - Convert.ToDateTime(nowTime);
ushort spanSecond = (ushort)span.TotalSeconds;
res = _plc.PlcWrite(_plc.DeltaInstance2, "D810", spanSecond, DataTypeEnum.UInt16).IsSuccess;
if (!res)
{
_log.Error("胶机2真空箱前时间计算结果PLC写入异常");
}
//写入完成信号
res = _plc.PlcWrite(_plc.DeltaInstance2, "D800", 4004, DataTypeEnum.UInt16).IsSuccess;
if (!res)
{
_log.Error("胶机2真空箱前时间计算PLC写入完成信号异常");
}
}
//流程完成
}
}
else
{
_log.Error("胶机2真空箱前开始时间读PLC取信号异常");
}
}
}
}

@ -0,0 +1,73 @@
using HslCommunication;
using Sln.Iot.PLC;
using Sln.Iot.Repository.service;
using Sln.Iot.Serilog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sln.Iot.Business
{
public class RFID05Business
{
private Timer _timer;
private readonly PLCConnect _plc;
private readonly SerilogHelper _log;
public RFID05Business()
{
_timer = new Timer(TimerCallback, null, 0, 5000);
}
/// <summary>
/// RFID02胶机1真空箱数据处理流程
/// </summary>
/// <param name="state"></param>
public void TimerCallback(object? state)
{
// 定时任务逻辑
//读取信号
OperateResult<short> signalRes = _plc.ReadInt16(_plc.DeltaInstance2, "D802");
//成功验证
if (signalRes.IsSuccess)
{
short signalValue = signalRes.Content;
//如果有读取信号
if (signalValue == 5001)
{
//读取托盘码
OperateResult<byte[]> trayBytesResult = _plc.ReadBytes(_plc.DeltaInstance2, "D5020", 20);
//成功验证
if (trayBytesResult.IsSuccess)
{
//转换托盘吗
string traycode = Encoding.ASCII.GetString(trayBytesResult.Content);
//sql更新
bool res = TrayBindingService.Instance.UpDateTime(DateTime.Now.ToString(), traycode, "4");
if (!res)
{
_log.Error("胶机2真空箱后数据库写入异常");
}
//写入完成信号
res = _plc.PlcWrite(_plc.DeltaInstance2, "D802", 5002, DataTypeEnum.UInt16).IsSuccess;
if (!res)
{
_log.Error("胶机2真空箱后PLC写入完成信号异常");
}
}
//流程完成
}
}
else
{
_log.Error("胶机2真空箱后PLC读取信号异常");
}
}
}
}

@ -0,0 +1,77 @@
using HslCommunication;
using Sln.Iot.PLC;
using Sln.Iot.Repository.service;
using Sln.Iot.Serilog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sln.Iot.Business
{
public class RFID06Business
{
private Timer _timer;
private readonly PLCConnect _plc;
private readonly SerilogHelper _log;
public RFID06Business()
{
_timer = new Timer(TimerCallback, null, 0, 5000);
}
/// <summary>
/// RFID02胶机1真空箱数据处理流程
/// </summary>
/// <param name="state"></param>
public void TimerCallback(object? state)
{
// 定时任务逻辑
//读取信号
OperateResult<short> signalRes = _plc.ReadInt16(_plc.DeltaInstance3, "D500");
//成功验证
if (signalRes.IsSuccess)
{
short signalValue = signalRes.Content;
//如果有读取信号
if (signalValue == 6001)
{
//读取托盘码和产品码
OperateResult<byte[]> trayBytesResult = _plc.ReadBytes(_plc.DeltaInstance3, "D5000", 20);
//成功验证
if (trayBytesResult.IsSuccess)
{
//转换托盘吗
string traycode = Encoding.ASCII.GetString(trayBytesResult.Content);
//sql更新
//待开发
bool res = TrayBindingService.Instance.TrayCodeDelete(traycode);
if (!res)
{
_log.Error("下料提升机绑定数据删除异常或删除条数为0");
}
//写入完成信号
res = _plc.PlcWrite(_plc.DeltaInstance3, "D500", 6002, DataTypeEnum.UInt16).IsSuccess;
if (!res)
{
_log.Error("下料提升机PLC写入完成信号异常");
}
}
//流程完成
}
}
else
{
_log.Error("下料提升机PLC读取信号异常");
}
}
}
}

@ -54,6 +54,8 @@ namespace Sln.Iot.PLC
CreateDeltaConnect("192.168.1.23", 502, 1), CreateDeltaConnect("192.168.1.23", 502, 1),
CreateDeltaConnect("192.168.1.24", 502, 1) CreateDeltaConnect("192.168.1.24", 502, 1)
}; };
await Task.WhenAll(tasks);
DeltaInstance1 = tasks[0].GetAwaiter().GetResult(); DeltaInstance1 = tasks[0].GetAwaiter().GetResult();
DeltaInstance2 = tasks[1].GetAwaiter().GetResult(); DeltaInstance2 = tasks[1].GetAwaiter().GetResult();

@ -73,9 +73,19 @@ namespace Sln.Iot.Repository
/// </summary> /// </summary>
/// <param name="trayCode"></param> /// <param name="trayCode"></param>
/// <returns></returns> /// <returns></returns>
public List<T> DeleteRange(string trayCode) public int DeleteRange(string trayCode)
{ {
return _connection.Query<T>($"DELETE FROM {typeof(T).Name} WHERE TrayCode = '{trayCode}'"); return _connection.Execute($"DELETE FROM {typeof(T).Name} WHERE TrayCode = '{trayCode}'");
}
/// <summary>
/// sql直接执行
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public int SqlExcute(string sql)
{
return _connection.Execute(sql);
} }
/// <summary> /// <summary>

@ -0,0 +1,41 @@
using SQLite;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sln.Iot.Repository.dao
{
/// <summary>
/// 产品参数存储
/// </summary>
public class ProdDataBinding
{
/// <summary>
/// 主键
/// </summary>
[PrimaryKey]
public string GUID { get; set; }
/// <summary>
/// 托盘码
/// </summary>
public string TrayCode { get; set; }
/// <summary>
/// 参数名称
/// </summary>
public string DataName { get; set; }
/// <summary>
/// 参数内容
/// </summary>
public string DataContent { get; set; }
/// <summary>
/// 参数类型bool, float, uint16, uint32, byte.......)
/// </summary>
public string DataType { get; set; }
}
}

@ -27,5 +27,25 @@ namespace Sln.Iot.Repository.dao
/// 产品编码 /// 产品编码
/// </summary> /// </summary>
public string ProductionCode { get; set; } public string ProductionCode { get; set; }
}
/// <summary>
/// RFID03流程时间
/// </summary>
public string? Time1 { get; set; }
/// <summary>
/// RFID04流程时间1
/// </summary>
public string? Time2 { get; set; }
/// <summary>
/// RFID04流程时间2
/// </summary>
public string? Time3 { get; set; }
/// <summary>
/// RFID05流程时间
/// </summary>
public string? Time4 { get; set; }
}
} }

@ -28,11 +28,29 @@ namespace Sln.Iot.Repository.service
private SerilogHelper _log = SerilogHelper.Instance; private SerilogHelper _log = SerilogHelper.Instance;
/// <summary>
/// 绑定信息根据托盘号删除
/// </summary>
/// <returns></returns>
public bool TrayCodeDelete(string trayCode)
{
try
{
int res = _helper.DeleteRange(trayCode);
return res != 0;
}
catch(Exception ex)
{
_log.Error("托盘码删除错误", ex);
return false;
}
}
/// <summary> /// <summary>
/// 托盘二维码重新绑定 /// 托盘二维码重新绑定
/// </summary> /// </summary>
/// <param name="trayCode"></param> /// <param name="trayCode">托盘码</param>
/// <param name="prodCode"></param> /// <param name="prodCode">产品码</param>
/// <returns></returns> /// <returns></returns>
public bool TrayBindingRefresh(string trayCode, string[] prodCode) public bool TrayBindingRefresh(string trayCode, string[] prodCode)
{ {
@ -44,6 +62,10 @@ namespace Sln.Iot.Repository.service
var entities = new List<TrayRfidBinding>(); var entities = new List<TrayRfidBinding>();
foreach (string code in prodCode) foreach (string code in prodCode)
{ {
if (string.IsNullOrWhiteSpace(code))
{
continue;
}
TrayRfidBinding entity = new TrayRfidBinding() TrayRfidBinding entity = new TrayRfidBinding()
{ {
GUID = Guid.NewGuid().ToString("N"), GUID = Guid.NewGuid().ToString("N"),
@ -61,5 +83,54 @@ namespace Sln.Iot.Repository.service
return false; return false;
} }
} }
/// <summary>
/// 存储对应托盘码的时间节点
/// </summary>
/// <param name="timeString">时间字符串</param>
/// <param name="trayCode">托盘码</param>
/// <param name="timeCount">时间参数编号</param>
/// <returns></returns>
public bool UpDateTime(string timeString, string trayCode, string timeCount)
{
try
{
int res = _helper.SqlExcute($"update TrayRfidBinding set time{timeCount} = '{timeString}' where TrayCode = '{trayCode}'");
if(res <= 0 || res > 6)
{
return false;
}
return true;
}
catch (Exception ex)
{
_log.Error("时间更新错误", ex);
return false;
}
}
/// <summary>
/// 获取一个时间
/// </summary>
/// <param name="trayCode"></param>
/// <returns></returns>
public string GetTime2ByTrayCode(string trayCode)
{
string time2 = string.Empty;
try
{
var res = _helper.Query(t => t.TrayCode == trayCode).FirstOrDefault();
if (res != null)
{
time2 = res.Time2;
}
return time2;
}
catch (Exception ex)
{
_log.Error("根据托盘码获取time2错误", ex);
return time2;
}
}
} }
} }

@ -51,8 +51,8 @@ namespace Sln.Iot.Test
}; };
var ress = SQLiteHelper<TrayRfidBinding>.Instance.InsertRange(testDatas); var ress = SQLiteHelper<TrayRfidBinding>.Instance.InsertRange(testDatas);
var res = SQLiteHelper<TrayRfidBinding>.Instance.DeleteRange("Tray001"); var res = SQLiteHelper<TrayRfidBinding>.Instance.DeleteRange("Tray002");
Assert.Equal(5, res.Count); Assert.Equal(5, res);
} }

@ -22,7 +22,7 @@ namespace Sln.Iot
var log = SerilogHelper.Instance; var log = SerilogHelper.Instance;
//配置文件加载 //配置文件加载
var appConfig = AppConfigSetting.Load(); var appConfig = AppConfigSetting.Load();
//PLC连接初始化
PLCConnect.Instance.InitConnect(); PLCConnect.Instance.InitConnect();
log.Info($"系统启动成功,日志存放位置:{appConfig.logPath}"); log.Info($"系统启动成功,日志存放位置:{appConfig.logPath}");

Loading…
Cancel
Save