当前位置:网站首页>Visual system design example (Halcon WinForm) -10. PLC communication
Visual system design example (Halcon WinForm) -10. PLC communication
2022-07-27 14:49:00 【11eleven】
Industrial vision projects are inseparable from the inferior PLC Data communication , For example, when the product is in place, notify the visual department to take photos for detection , Vision starts to trigger the light source camera to take pictures Image processing , The final result output forms a closed loop , Like our commonly used Siemens PLC Mitsubishi PLC And so on have corresponding communication methods , Most of them define the address of the communication mark , Perform the address polling check and perform the corresponding operation . This article takes Siemens as an example , Siemens S7 agreement , Used Hsl The open source protocol library of encapsulates a pair of S7 The connection reading and writing method of the Protocol .


NUGET Install class library 7.0 Free version .
public bool Connect(out ResultMessage resut, string serverUrl = "192.168.10.10", int port = 4000, PLCModelEnum pLCModel = PLCModelEnum.S7_1200)
{
if (pLCModel == PLCModelEnum.S7_1200)
{
if (Plc == null)
{
Plc = new SiemensS7Net( SiemensPLCS.S1200,serverUrl)
{
ConnectTimeOut = 5000,
ReceiveTimeOut = 500
};
}
try
{
var open = Plc.ConnectServer();
if (open.IsSuccess)
{
IsConnect = true;
//PLC Open the success
resut = new ResultMessage()
{
IsSuccess = true,
ErrorMsg = open.Message
};
return true;
}
else
{
IsConnect = false;
Plc = null;
resut = new ResultMessage()
{
IsSuccess = false,
ErrorMsg = open.Message
};
return false;
}
}
catch (Exception ex)
{
IsConnect = false;
Plc = null;
resut = new ResultMessage()
{
IsSuccess = false,
ErrorMsg = $"Connect PLC Error:{ex.Message}"
};
return false;
}
}
else
{
IsConnect = false;
resut = new ResultMessage()
{
IsSuccess = false,
ErrorMsg = "Unknow PLC Model"
};
return false;
}
}
public T ReadNode<T>(string tag, out ResultMessage result, ushort length = 0)
{
T ret = default;
if (Plc == null)
{
result = new ResultMessage()
{
IsSuccess = false,
ErrorMsg = " Connection not initialized "
};
return ret;
}
result = default;
Type type = typeof(T);
switch (type.Name)
{
case nameof(Boolean):
{
var r = Plc.ReadBool(tag);
result = new ResultMessage()
{
IsSuccess = r.IsSuccess,
ErrorMsg = r.Message
};
if (r.IsSuccess)
ret = (T)Convert.ChangeType(r.Content, typeof(T));
}
break;
case nameof(Int16):
{
var r = Plc.ReadInt16(tag);
result = new ResultMessage()
{
IsSuccess = r.IsSuccess,
ErrorMsg = r.Message
};
if (r.IsSuccess)
ret = (T)Convert.ChangeType(r.Content, typeof(T));
}
break;
case nameof(UInt16):
{
var r = Plc.ReadUInt16(tag);
result = new ResultMessage()
{
IsSuccess = r.IsSuccess,
ErrorMsg = r.Message
};
if (r.IsSuccess)
ret = (T)Convert.ChangeType(r.Content, typeof(T));
}
break;
case nameof(Int32):
{
var r = Plc.ReadInt32(tag);
result = new ResultMessage()
{
IsSuccess = r.IsSuccess,
ErrorMsg = r.Message
};
if (r.IsSuccess)
ret = (T)Convert.ChangeType(r.Content, typeof(T));
}
break;
case nameof(UInt32):
{
var r = Plc.ReadUInt32(tag);
result = new ResultMessage()
{
IsSuccess = r.IsSuccess,
ErrorMsg = r.Message
};
if (r.IsSuccess)
ret = (T)Convert.ChangeType(r.Content, typeof(T));
}
break;
case nameof(Int64):
{
var r = Plc.ReadInt64(tag);
result = new ResultMessage()
{
IsSuccess = r.IsSuccess,
ErrorMsg = r.Message
};
if (r.IsSuccess)
ret = (T)Convert.ChangeType(r.Content, typeof(T));
}
break;
case nameof(UInt64):
{
var r = Plc.ReadUInt64(tag);
result = new ResultMessage()
{
IsSuccess = r.IsSuccess,
ErrorMsg = r.Message
};
if (r.IsSuccess)
ret = (T)Convert.ChangeType(r.Content, typeof(T));
}
break;
case nameof(Single):
{
var r = Plc.ReadFloat(tag);
result = new ResultMessage()
{
IsSuccess = r.IsSuccess,
ErrorMsg = r.Message
};
if (r.IsSuccess)
ret = (T)Convert.ChangeType(r.Content, typeof(T));
}
break;
case nameof(Double):
{
var r = Plc.ReadDouble(tag);
result = new ResultMessage()
{
IsSuccess = r.IsSuccess,
ErrorMsg = r.Message
};
if (r.IsSuccess)
ret = (T)Convert.ChangeType(r.Content, typeof(T));
}
break;
case nameof(String):
{
// If the length is 0, This is set as the default 1
if (length == 0)
{
length = 1;
}
var addressStr = tag;
var index = tag.IndexOf(".");
var lastIndex = tag.LastIndexOf(".");
if (lastIndex != index && lastIndex < tag.Length - 1)
{
try
{
addressStr = tag.Substring(0, lastIndex);
length = Convert.ToUInt16(tag.Substring(lastIndex + 1));
}
catch
{
}
}
// When reading, the characters read are shifted back 2 position
if (addressStr.IndexOf(".") > -1) {
var addressArr = addressStr.Split('.');
addressStr = $"{addressArr[0]}.{addressArr[1].ToInt() + 2}";
}
var r = Plc.ReadString(addressStr, length);
result = new ResultMessage() { IsSuccess = r.IsSuccess, ErrorMsg = r.Message };
if (r.IsSuccess)
ret = (T)Convert.ChangeType(r.Content, typeof(T));
}
break;
case nameof(Char):
{
var r = Plc.ReadString(tag, 1);
result = new ResultMessage()
{
IsSuccess = r.IsSuccess,
ErrorMsg = r.Message
};
if (r.IsSuccess)
ret = (T)Convert.ChangeType(r.Content.ToCharArray()[0], typeof(T));
}
break;
default: break;
}
return ret;
}
public bool WriteNode(string tag, object value, out ResultMessage result)
{
if (Plc == null)
{
result = new ResultMessage()
{
IsSuccess = false,
ErrorMsg = " Connection not initialized "
};
return false;
}
OperateResult ret = default;
switch (value.GetType().Name)
{
case nameof(Boolean):
{
ret = Plc.Write(tag, (bool)value);
}
break;
case nameof(Int16):
{
ret = Plc.Write(tag, (short)value);
}
break;
case nameof(UInt16):
{
ret = Plc.Write(tag, (ushort)value);
}
break;
case nameof(Int32):
{
ret = Plc.Write(tag, (int)value);
}
break;
case nameof(UInt32):
{
ret = Plc.Write(tag, (uint)value);
}
break;
case nameof(Int64):
{
ret = Plc.Write(tag, (long)value);
}
break;
case nameof(UInt64):
{
ret = Plc.Write(tag, (ulong)value);
}
break;
case nameof(Single):
{
ret = Plc.Write(tag, (float)value);
}
break;
case nameof(Double):
{
ret = Plc.Write(tag, (double)value);
}
break;
case nameof(String):
{
string strValue = (string)value;
var addressStr = tag;
var index = tag.IndexOf(".");
var lastIndex = tag.LastIndexOf(".");
if (lastIndex != index && lastIndex < tag.Length - 1)
{
try
{
addressStr = tag.Substring(0, lastIndex);
int len = tag.Substring(lastIndex+1).ToInt();
if (value.ToString().Length < len) {
strValue = strValue.PadRight(len,'\0');
}
}
catch
{
}
}
ret = Plc.Write(addressStr, strValue);
}
break;
default: break;
}
result = new ResultMessage()
{
IsSuccess = ret.IsSuccess,
ErrorMsg = ret.Message
};
return ret.IsSuccess;
}
边栏推荐
- 获取Unity打开摄像头第一帧有画面的数据
- 一文搞懂 Redis 架构演化之路
- Regular expressions: mailbox matching
- Construction of knowledge map of financial securities and discovery of related stocks from the perspective of knowledge relevance
- Document translation__ Salt and pepper image denoising based on adaptive total variation L1 regularization
- Toward fast, flexible, and robust low light image enhancement cvpr2022
- Lesson 3: SPFA seeking the shortest path
- 如何帮助企业优化Office管理
- 初学者入门:使用WordPress搭建一个专属自己的博客
- va_ List usage summary
猜你喜欢
![Detailed explanation of Telnet remote login AAA mode [Huawei ENSP]](/img/48/dd0fa3c494c45f604b7a93c707b808.png)
Detailed explanation of Telnet remote login AAA mode [Huawei ENSP]

c语言分层理解(c语言数组)

Redis

FPGA时序约束分享04_output delay 约束

万字详解 Google Play 上架应用标准包格式 AAB

FPGA timing constraint sharing 04_ Output delay constraint
![[popular science] the difference and connection between accuracy and resolution](/img/12/efcce1f6b8801d8d8b08b79818632c.png)
[popular science] the difference and connection between accuracy and resolution

Redis

【STM32】EXTI

DirectX 入门知识
随机推荐
【STM32】EXTI
SkyWalking分布式系统应用程序性能监控工具-中
How to deploy open source Siyuan privately
Toward Fast, Flexible, and Robust Low-Light Image Enhancement(实现快速、灵活和稳健的弱光图像增强)CVPR2022
Forward proxy and reverse proxy
DXGI 方式采集流程
[intensive reading of papers] grounded language image pre training (glip)
终于有人把面试必考的动态规划、链表、二叉树、字符串全部撸完了
Database storage series (1) column storage
Redis
Hdu1422 revisits the world cup [DP]
CPU、GPU、NPU的区别
面试官问:如何判断一个元素是否在可视区域?
网上券商APP开户安全有保障吗?
codeforces 1708E - DFS Trees
Summary of basic knowledge of C language
Printf function buffer problem
uniapp的request数据请求简单封装步骤
idea打jar包与引入jar包
C语言基础练习题目