创作背景:在工控行业,PC与PLC之间的通断直接决定了整体系统的可靠性。为了监控PC与PLC是否处于正常连接状态,引入了心跳机制,顾名思义就是通过模拟心脏跳动,在程序中即为定时通讯。我这里只做PC给PLC心跳信号,思路如下:创建PLC连接,定时向PLC固定的DB地址中写入变化的值(1与2交替变化)。
实现步骤:
第一步:通过引入S7.Net,与西门子PLC建立连接(这里我选用的是异步创建连接)。
static Plc plc;
/// <summary>
/// 连接PLC
/// </summary>
public void PLCConnect()
{
try
{
OpenPLC();
}
catch (Exception ex) { }
}
/// <summary>
/// 打开PLC
/// </summary>
public async void OpenPLC()
{
try
{
if (plc == null)
plc = new Plc(CpuType.S71500, IPAddress, 0, 0);
if (plc != null && !plc.IsConnected)
await plc.OpenAsync();
}
catch (Exception ex) { }
}
第二步:设置获取心跳新值的属性。(其中iHart为私有变量,自行创建即可)
/// <summary>
/// 获取心跳信号值
/// </summary>
public byte GetHartSign
{
get
{
if (iHart == 1)
iHart = 2;
else
iHart = 1;
return iHart;
}
}
第三步:通过Stopwatch()类,来监控是否再次发送心跳信号。(项目中还有其他功能,未删除)
Stopwatch stopwatchHeartBeat = new Stopwatch();
/// <summary>
/// 循环程序入口
/// </summary>
/// <param name="enumTimeSync">触发类型</param>
/// <param name="DBNum">DB块</param>
/// <param name="startAdr">起始地址</param>
/// <param name="value">值</param>
public void MethodEntry(EnumTimeSync enumTimeSync, int DBNum, int startAdr, byte? value = null)
{
switch (enumTimeSync)
{
case EnumTimeSync.TimeSync:
TimeSync(DBNum, startAdr);
break;
case EnumTimeSync.TimeSign:
if (value != null && stopwatchTimeSign.ElapsedMilliseconds > 3000)
TimeSign(DBNum, startAdr, (byte)value);
break;
case EnumTimeSync.HeartBeat:
if (stopwatchHeartBeat.ElapsedMilliseconds > 3000)
{
TimeSign(DBNum, startAdr, GetHartSign);
stopwatchHeartBeat.Restart();
}
break;
default:
break;
}
}
至此,PC与PLC通讯之心跳机制的基本框架就完成了,欢迎各位伙伴参考与指正!
代码连接:点我跳转至程序连接