feat - PLC业务开发完成

master
SoulStar 2 months ago
parent 18f73cd51a
commit 5b7e5eee6c

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

@ -1,5 +1,6 @@
using HslCommunication;
using Sln.Iot.PLC;
using Sln.Iot.Repository.service;
using Sln.Iot.Serilog;
using System;
using System.Collections.Generic;
@ -23,27 +24,53 @@ namespace Sln.Iot.Business
}
/// <summary>
/// RFID02上料提升机数据处理流程业务刷新
/// RFID02胶机1真空箱内数据处理流程
/// </summary>
/// <param name="state"></param>
public void TimerCallback(object? state)
{
// 定时任务逻辑
OperateResult<short> signalRes = _plc.ReadInt16(_plc.DeltaInstance1, "D500");
//读取信号
OperateResult<short> signalRes = _plc.ReadInt16(_plc.DeltaInstance1, "D800");
//成功验证
if (signalRes.IsSuccess)
{
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);
if(trayBytesResult.IsSuccess && pordBytesResult.IsSuccess)
//读取托盘码
OperateResult<byte[]> trayBytesResult = _plc.ReadBytes(_plc.DeltaInstance1, "D5000", 20);
//成功验证
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读取信号异常");
}
}
}
}

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

@ -73,9 +73,19 @@ namespace Sln.Iot.Repository
/// </summary>
/// <param name="trayCode"></param>
/// <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>

@ -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>
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;
/// <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>
/// <param name="trayCode"></param>
/// <param name="prodCode"></param>
/// <param name="trayCode">托盘码</param>
/// <param name="prodCode">产品码</param>
/// <returns></returns>
public bool TrayBindingRefresh(string trayCode, string[] prodCode)
{
@ -44,6 +62,10 @@ namespace Sln.Iot.Repository.service
var entities = new List<TrayRfidBinding>();
foreach (string code in prodCode)
{
if (string.IsNullOrWhiteSpace(code))
{
continue;
}
TrayRfidBinding entity = new TrayRfidBinding()
{
GUID = Guid.NewGuid().ToString("N"),
@ -61,5 +83,54 @@ namespace Sln.Iot.Repository.service
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 res = SQLiteHelper<TrayRfidBinding>.Instance.DeleteRange("Tray001");
Assert.Equal(5, res.Count);
var res = SQLiteHelper<TrayRfidBinding>.Instance.DeleteRange("Tray002");
Assert.Equal(5, res);
}

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

Loading…
Cancel
Save