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

172 lines
6.5 KiB

using HslCommunication.ModBus;
using HslCommunication;
using HybirdFrameworkCore.Autofac.Attribute;
using HybirdFrameworkDriver.ModbusTcpMaster;
using HybirdFrameworkDriver.TcpServer;
using HybirdFrameworkEntity.DbModel;
using HybirdFrameworkRepository.System;
using HybirdFrameworkServices.Init.Entity;
using HybirdFrameworkServices.Plc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HybirdFrameworkServices
{
[Scope("SingleInstance")]
public class EquipmentInit
{
#region
BsNetEqmParamInfoRepository _bsNetEqmParamInfoRepository;
public EquipmentInit(BsNetEqmParamInfoRepository bsNetEqmParamInfoRepository)
{
_bsNetEqmParamInfoRepository = bsNetEqmParamInfoRepository;
}
/// <summary>
/// 连接所有数据
/// </summary>
/// <exception cref="InvalidOperationException"></exception>
public void Connect()
{
BsNetEqmParamInfo bsNetEqmParamInfo = new BsNetEqmParamInfo()
{
EqmTypeNo = 3,
EqmTypeName = "",
EqmCode = "",
EqmSn = 3,
NetAddr = "127.0.0.1",
NetPort = "502",
DestAddr = "1",
};
ConnectPlc(bsNetEqmParamInfo);
}
/// <summary>
/// 连接PLC
/// </summary>
/// <param name="param"></param>
/// <returns></returns>
public int ConnectPlc(/*IGrouping<int, BsNetEqmParamInfo> param*/ BsNetEqmParamInfo p)
{
Thread thread = new Thread(() => ConnectPlcAsync(p));
thread.Start();
return 0;
}
/// <summary>
/// 连接PLC
/// </summary>
/// <param name="p"></param>
private void ConnectPlcAsync(BsNetEqmParamInfo p)
{
bool connected = false;
ModbusTcpMaster master = null;
//PLC连接
while (!connected)
{
master = new ModbusTcpMaster()
{
Ip = "172.0.20.66",
Port = 502,
};
master.ReadAction = BatchReadPlc;//启动线程一直读
master.Duration = 3000;
connected = master.Connect();
if (connected)
{
break;
}
Thread.Sleep(5000);
}
ModbusSession modbusSession = new ModbusSession(master);
master.connectId = master.Ip + master.Port;
SessionMgr.RegisterModbusSession(master.connectId, modbusSession);
SessionMgr.SetAttrModbus(modbusSession, "eqm_sn", p.EqmSn);
PlcInfo waterColdInfo = new PlcInfo(master.connectId, p.EqmSn);
ChargerStaticInfo.PlcInfos.TryAdd(p.EqmSn, waterColdInfo);
}
/**
* 一直读
*/
private static void BatchReadPlc(ModbusTcpMaster master)
{
while (true)
{
int sn = 3;//(int)SessionMgr.GetAttrModbus(master.connectId, "eqm_sn");
ChargerStaticInfo.PlcInfos.TryGetValue(sn, out PlcInfo plcInfo);
if (plcInfo != null)
{
var bytes01 = master.BatchRead(1, 115);
if (bytes01 != null)
{
ModbusDecoder.Decode<HostToPlc>(bytes01, plcInfo.hostToPlc);
}
var bytes02 = master.BatchRead(201, 222);
if (bytes02 != null)
{
ModbusDecoder.Decode<PlcToHost>(bytes02, plcInfo.plcToHost);
}
var bytes03 = master.BatchRead(701, 10);
if (bytes03 != null)
{
ModbusDecoder.Decode<PlcFault>(bytes03, plcInfo.plcFault);
}
//OperateResult<byte[]> result2 = ModbusTcpNet.Read("x=3;201", 222);
}
/*
if (plcInfo != null)
{
byte[]? bytes01 = master.BatchRead(0, 22);
if (bytes01 != null)
{
ModbusDecoder.DecodeByT<PlcReadAndWrite2>(bytes01, plcInfo.PlcReadAndWritten2);
}
byte[]? bytes02 = master.BatchRead(256, 170);
if (bytes02 != null)
{
ModbusDecoder.DecodeByT<PlcReadonly>(bytes02, plcInfo.PlcReadonly);
}
byte[]? bytes03 = master.BatchRead(39424, 108);
if (bytes03 != null)
{
ModbusDecoder.DecodeByT<PlcTurnsRatio>(bytes03, plcInfo.PlcTurnsRatio);
}
byte[]? bytes04 = master.BatchRead(40960, 3);//写编程使能。本机modbus地址。波特率
byte[]? bytes05 = master.BatchRead(2566, 1);//校验位
byte[]? bytes06 = master.BatchRead(42, 1);//秒脉冲/无功电能选择
byte[]? bytes07 = master.BatchRead(48, 1);//电流接线反向
byte[]? bytes08 = master.BatchRead(4576, 1);//电表清零
if (bytes04 != null)
{
ModbusDecoder.DecodeByT<PlcReadAndWrite1>(bytes04, plcInfo.PlcReadAndWritten1);
}
plcInfo.PlcReadAndWritten1.CheckBit = master.ModbusTcpNet.ByteTransform.TransUInt16(bytes05, 0);
plcInfo.PlcReadAndWritten1.PulsePerSecond = master.ModbusTcpNet.ByteTransform.TransUInt16(bytes06, 0);
plcInfo.PlcReadAndWritten1.CurrentReversal = master.ModbusTcpNet.ByteTransform.TransUInt16(bytes07, 0);
plcInfo.PlcReadAndWritten1.MeterReset = master.ModbusTcpNet.ByteTransform.TransUInt16(bytes08, 0);
}
*/
}
}
#endregion PLC
}
}