|
@@ -27,22 +27,49 @@ namespace parkMonitor.server
|
|
|
/// </summary>
|
|
|
public class PLCLinker : IEquipments
|
|
|
{
|
|
|
+ /// <summary>
|
|
|
+ /// PLC 连接状态flag
|
|
|
+ /// </summary>
|
|
|
private Boolean isConnection = false;
|
|
|
- private bool isRecorded = false, exceptionBreak = false, isClosing = false;
|
|
|
+ /// <summary>
|
|
|
+ /// 激光数据记录状态flag
|
|
|
+ /// </summary>
|
|
|
+ private bool isRecorded = false;
|
|
|
+ /// <summary>
|
|
|
+ /// 读写异常状态flag
|
|
|
+ /// </summary>
|
|
|
+ private bool exceptionBreak = false;
|
|
|
+ /// <summary>
|
|
|
+ /// 系统关闭flag
|
|
|
+ /// </summary>
|
|
|
+ private bool isClosing = false;
|
|
|
/// <summary>
|
|
|
/// 从PLC读到的字符串
|
|
|
/// </summary>
|
|
|
- private static string json = "";//读到的数据
|
|
|
+ private static string json = "";
|
|
|
/// <summary>
|
|
|
/// 将写入PLC的字符串
|
|
|
/// </summary>
|
|
|
- private string json2 = "";//写入的数据
|
|
|
+ private string json2 = "";
|
|
|
+ /// <summary>
|
|
|
+ /// 从plc获得结构化数据
|
|
|
+ /// </summary>
|
|
|
private PLCMessage plcMsg;
|
|
|
+ /// <summary>
|
|
|
+ /// 定时器
|
|
|
+ /// </summary>
|
|
|
System.Timers.Timer timer;
|
|
|
- //parameteres for plc read function
|
|
|
+ /// <summary>
|
|
|
+ /// 读PLC初始地址
|
|
|
+ /// </summary>
|
|
|
private int startAddr = 0;
|
|
|
+ /// <summary>
|
|
|
+ /// 读PLC地址长度
|
|
|
+ /// </summary>
|
|
|
private int addrLength = 110;
|
|
|
- /// <summary> plc重连标记位 </summary>
|
|
|
+ /// <summary>
|
|
|
+ /// plc重连标记位
|
|
|
+ /// </summary>
|
|
|
private int linkCount = 0;
|
|
|
/// <summary>
|
|
|
/// 无法获取配置文件时使用的PLC刷新频率
|
|
@@ -76,16 +103,45 @@ namespace parkMonitor.server
|
|
|
/// 停车激光数据入口
|
|
|
/// </summary>
|
|
|
private int parkingLaserCenterX_address;
|
|
|
- //parameters(addresses) for Laser monitoring
|
|
|
+ /// <summary>
|
|
|
+ /// 启动激光地址
|
|
|
+ /// </summary>
|
|
|
private int laser_start_address;
|
|
|
+ /// <summary>
|
|
|
+ /// 取车完成地址
|
|
|
+ /// </summary>
|
|
|
private int fetch_completed_address;
|
|
|
+ /// <summary>
|
|
|
+ /// 取车完成已获得标志地址
|
|
|
+ /// </summary>
|
|
|
private int fetch_completed_acknowledge_address;
|
|
|
+ /// <summary>
|
|
|
+ /// 取至缓冲区地址
|
|
|
+ /// </summary>
|
|
|
private int fetch_to_address;
|
|
|
+ /// <summary>
|
|
|
+ /// 前轮距转存地址
|
|
|
+ /// </summary>
|
|
|
private int frontWheelbase_address;
|
|
|
+ /// <summary>
|
|
|
+ /// 后轮距转存地址
|
|
|
+ /// </summary>
|
|
|
private int rearWheelbase_address;
|
|
|
+ /// <summary>
|
|
|
+ /// 停车完成地址
|
|
|
+ /// </summary>
|
|
|
private int park_completed_address;
|
|
|
+ /// <summary>
|
|
|
+ /// 停车完成已获得地址
|
|
|
+ /// </summary>
|
|
|
private int park_completed_acknowledge_address;
|
|
|
+ /// <summary>
|
|
|
+ /// 激光重测总数
|
|
|
+ /// </summary>
|
|
|
private int LASER_RESCAN_COUNT;
|
|
|
+ /// <summary>
|
|
|
+ /// 激光心跳检测窗口阈值
|
|
|
+ /// </summary>
|
|
|
private int LASER_HEARTBEAT_PERIOD;
|
|
|
/// <summary>
|
|
|
/// PLC刷新频率,来自于配置文件
|
|
@@ -163,7 +219,7 @@ namespace parkMonitor.server
|
|
|
{
|
|
|
decompressIndex.Add((48 + i).ToString());
|
|
|
}
|
|
|
- //70-76
|
|
|
+ //70-82
|
|
|
for (int i = 0; i < 13; i++)
|
|
|
{
|
|
|
decompressIndex.Add((70 + i).ToString());
|
|
@@ -176,12 +232,18 @@ namespace parkMonitor.server
|
|
|
}
|
|
|
|
|
|
//**************************************** PLC读写相关方法 **************************************
|
|
|
+ /// <summary>
|
|
|
+ /// PLC连接对象
|
|
|
+ /// </summary>
|
|
|
private ModBusTcpClient busTcpClient
|
|
|
{
|
|
|
get;
|
|
|
set;
|
|
|
}
|
|
|
-
|
|
|
+ /// <summary>
|
|
|
+ /// 写入字符串到json2
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="message">将写入的字符串</param>
|
|
|
private void WriteMessage(string message)
|
|
|
{
|
|
|
isRecorded = true;
|
|
@@ -189,7 +251,10 @@ namespace parkMonitor.server
|
|
|
json2 = message;
|
|
|
}
|
|
|
|
|
|
- ///<summary>采集数据显示转json</summary>
|
|
|
+ /// <summary>
|
|
|
+ /// 采集数据显示转json
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="str">将被转为json字符串的字符串</param>
|
|
|
private static void DisplayString_ToJson(string str)
|
|
|
{
|
|
|
List<PLCNode> return_Value = new List<PLCNode>();
|
|
@@ -214,7 +279,12 @@ namespace parkMonitor.server
|
|
|
//Console.WriteLine(json);
|
|
|
}
|
|
|
|
|
|
- ///<summary>截取</summary>
|
|
|
+ /// <summary>
|
|
|
+ /// 截取字符串到字符串数组
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="txtString">输入字符串</param>
|
|
|
+ /// <param name="charNumber">最大字符个数</param>
|
|
|
+ /// <returns></returns>
|
|
|
private static ArrayList GetSeparateSubString(string txtString, int charNumber)
|
|
|
{
|
|
|
ArrayList arrList = new ArrayList();
|
|
@@ -252,7 +322,11 @@ namespace parkMonitor.server
|
|
|
timer.Elapsed += new ElapsedEventHandler(TimerUp);
|
|
|
}
|
|
|
|
|
|
- ///<summary>实时采集</summary>
|
|
|
+ /// <summary>
|
|
|
+ /// 实时采集
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="sender">发送者对象,系统提供</param>
|
|
|
+ /// <param name="e">定时数据</param>
|
|
|
private void TimerUp(object sender, System.Timers.ElapsedEventArgs e)
|
|
|
{
|
|
|
try
|
|
@@ -300,7 +374,11 @@ namespace parkMonitor.server
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- ///<summary>读取</summary>
|
|
|
+ /// <summary>
|
|
|
+ /// 从PLC读取数据
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="address">地址</param>
|
|
|
+ /// <param name="length">值</param>
|
|
|
private void PLC_Read(ushort address, ushort length)
|
|
|
{
|
|
|
try
|
|
@@ -327,7 +405,10 @@ namespace parkMonitor.server
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- ///<summary>写入</summary>
|
|
|
+ /// <summary>
|
|
|
+ /// 写入Json字符串到PLC
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="json">json格式字符串</param>
|
|
|
private void WriteJson(string json)
|
|
|
{
|
|
|
try
|
|
@@ -349,8 +430,11 @@ namespace parkMonitor.server
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- ///<summary>写入判断</summary>
|
|
|
- private static void WriteResultRender(OperateResult result, string address)
|
|
|
+ /// <summary>
|
|
|
+ /// 判断写入是否成功
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="result">判断结果</param>
|
|
|
+ private static void WriteResultRender(OperateResult result)
|
|
|
{
|
|
|
if (result.IsSuccess)
|
|
|
{
|
|
@@ -362,7 +446,11 @@ namespace parkMonitor.server
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- ///<summary>地址-值写入plc</summary>
|
|
|
+ /// <summary>
|
|
|
+ /// 地址-值写入plc
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="addr">地址</param>
|
|
|
+ /// <param name="value">值</param>
|
|
|
private void SendtoPLC(string addr, string value)
|
|
|
{
|
|
|
PLCNode wrv = new PLCNode();
|
|
@@ -413,7 +501,12 @@ namespace parkMonitor.server
|
|
|
InitTimer();//启动计时器
|
|
|
}
|
|
|
|
|
|
- /// <summary>将plc地址块完全解压</summary>
|
|
|
+ /// <summary>
|
|
|
+ /// 将plc地址块完全解压
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="plcList">原始PLC数据列表</param>
|
|
|
+ /// <param name="decompressIndex">压缩数据段</param>
|
|
|
+ /// <returns>解压后的数据列表</returns>
|
|
|
private List<PLCNode> ListDecompression(List<PLCNode> plcList, List<string> decompressIndex)
|
|
|
{
|
|
|
List<string> temp = new List<string>();
|
|
@@ -521,7 +614,7 @@ namespace parkMonitor.server
|
|
|
/// <summary>
|
|
|
/// 等待激光空闲状态/心跳状态
|
|
|
/// </summary>
|
|
|
- /// <param name="lpuTemp"></param>
|
|
|
+ /// <param name="lpuTemp">激光处理单元</param>
|
|
|
private void WaitForLaserReady(LaserProcessUnit lpuTemp)
|
|
|
{
|
|
|
bool jumpOut = false;
|
|
@@ -951,6 +1044,9 @@ namespace parkMonitor.server
|
|
|
private int LASER_RESCAN_COUNT, LASER_HEARTBEAT_PERIOD, laser_rescan_countdown, laser_heartbeat_countdown;
|
|
|
private bool laser_record, laser_heartbeat_test, enable_status_check = true, disordered = false;
|
|
|
private HashSet<int> laser_heartbeat = new HashSet<int>();
|
|
|
+ /// <summary>
|
|
|
+ /// plc类句柄
|
|
|
+ /// </summary>
|
|
|
private IEquipments plc = null;
|
|
|
/// <summary>
|
|
|
/// 激光消息,用于保存激光数据、状态等信息
|
|
@@ -960,11 +1056,11 @@ namespace parkMonitor.server
|
|
|
/// <summary>
|
|
|
/// 激光处理单元构造函数,初始化各属性值
|
|
|
/// </summary>
|
|
|
- /// <param name="id"></param>
|
|
|
- /// <param name="park_command_address"></param>
|
|
|
- /// <param name="laser_status_address"></param>
|
|
|
- /// <param name="laser_rescan_count"></param>
|
|
|
- /// <param name="laser_heartbeat_period"></param>
|
|
|
+ /// <param name="id">编号</param>
|
|
|
+ /// <param name="park_command_address">停车指令地址</param>
|
|
|
+ /// <param name="laser_status_address">激光状态地址</param>
|
|
|
+ /// <param name="laser_rescan_count">激光重测次数</param>
|
|
|
+ /// <param name="laser_heartbeat_period">激光心跳时间窗口</param>
|
|
|
public LaserProcessUnit(int id, int park_command_address, int laser_status_address, int laser_rescan_count, int laser_heartbeat_period)
|
|
|
{
|
|
|
try
|
|
@@ -990,8 +1086,8 @@ namespace parkMonitor.server
|
|
|
/// <summary>
|
|
|
/// 更新激光状态
|
|
|
/// </summary>
|
|
|
- /// <param name="addr"></param>
|
|
|
- /// <param name="value"></param>
|
|
|
+ /// <param name="addr">地址</param>
|
|
|
+ /// <param name="value">值</param>
|
|
|
public void UpdateLaserStatus(int addr, int value)
|
|
|
{
|
|
|
int status_addr = laser_status_address;
|
|
@@ -1007,7 +1103,11 @@ namespace parkMonitor.server
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- ///<summary>激光状态监测</summary>
|
|
|
+ /// <summary>
|
|
|
+ /// 激光状态监测
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="addr">地址</param>
|
|
|
+ /// <param name="value">值</param>
|
|
|
public void LaserStatusChecking(int addr, int value)
|
|
|
{
|
|
|
if (enable_status_check)
|
|
@@ -1182,7 +1282,10 @@ namespace parkMonitor.server
|
|
|
else { return; }
|
|
|
}
|
|
|
|
|
|
- /// <summary>激光数据记录</summary>
|
|
|
+ /// <summary>
|
|
|
+ /// 激光数据记录
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="plist">plc数据列表</param>
|
|
|
public void LaserRecord(List<PLCNode> plist)
|
|
|
{
|
|
|
lock (laserMsg)
|
|
@@ -1274,18 +1377,18 @@ namespace parkMonitor.server
|
|
|
/// <summary>
|
|
|
/// 构造函数,初始化各属性值
|
|
|
/// </summary>
|
|
|
- /// <param name="id"></param>
|
|
|
- /// <param name="parking_startRobot_address"></param>
|
|
|
- /// <param name="parking_laserCenterX_address"></param>
|
|
|
- /// <param name="parkingSpaceID_address"></param>
|
|
|
- /// <param name="park_completed_address"></param>
|
|
|
- /// <param name="park_completed_acknowledge_address"></param>
|
|
|
- /// <param name="fetching_startRobot_address"></param>
|
|
|
- /// <param name="fetch_to_address"></param>
|
|
|
- /// <param name="fetch_completed_address"></param>
|
|
|
- /// <param name="fetch_completed_acknowledge_address"></param>
|
|
|
- /// <param name="frontWheelbase"></param>
|
|
|
- /// <param name="rearWheelbase"></param>
|
|
|
+ /// <param name="id">编号</param>
|
|
|
+ /// <param name="parking_startRobot_address">停车启动机械手地址</param>
|
|
|
+ /// <param name="parking_laserCenterX_address">停车激光中心X坐标</param>
|
|
|
+ /// <param name="parkingSpaceID_address">车位ID地址</param>
|
|
|
+ /// <param name="park_completed_address">停车完成地址</param>
|
|
|
+ /// <param name="park_completed_acknowledge_address">停车完成获取标志地址</param>
|
|
|
+ /// <param name="fetching_startRobot_address">取车启动机械手地址</param>
|
|
|
+ /// <param name="fetch_to_address">取至缓冲区地址</param>
|
|
|
+ /// <param name="fetch_completed_address">取车完成地址</param>
|
|
|
+ /// <param name="fetch_completed_acknowledge_address">取车完成获得标志地址</param>
|
|
|
+ /// <param name="frontWheelbase">前轮距转存</param>
|
|
|
+ /// <param name="rearWheelbase">后轮距转存</param>
|
|
|
public RobotProcessUnit(int id, int parking_startRobot_address, int parking_laserCenterX_address, int parkingSpaceID_address, int park_completed_address, int park_completed_acknowledge_address, int fetching_startRobot_address, int fetch_to_address, int fetch_completed_address, int fetch_completed_acknowledge_address, int frontWheelbase, int rearWheelbase)
|
|
|
{
|
|
|
this.id = id;
|