当前位置:网站首页>视觉系统设计实例(halcon-winform)-10.PLC通讯
视觉系统设计实例(halcon-winform)-10.PLC通讯
2022-07-27 13:35:00 【11eleven】
工业视觉项目少不了与下位PLC进行数据通讯,例如产品就位通知视觉进行拍照检测,视觉开始触发光源相机拍照 进行图像处理,最后结果输出形成闭环,像我们常用的西门子PLC三菱PLC等等都有相应的通讯方式,大都是定义通讯标记的地址,进行地址轮询校验识进行对应的操作。本篇以西门子为例,西门子的S7协议,用了的Hsl的开源协议库封装了对S7协议的连接读写方法。


NUGET安装类库7.0 属于免费版本。
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打开成功
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 = "未初始化连接"
};
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):
{
//如果长度为0,这设为默认值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
{
}
}
// 读取时读取的字符往后偏移2位
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 = "未初始化连接"
};
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;
}
边栏推荐
- Mining enterprise association based on Enterprise Knowledge Map
- JS 疫情宅在家,学习不能停,七千字长文助你彻底弄懂原型与原型链
- Research on automatic classification of electronic medical records based on unbalanced data
- STM32——电容触摸按键实验
- codeforces 1708E - DFS Trees
- Chapter 3 business function development (add clues and remarks, and automatically refresh the added content)
- Is the security of online brokerage app account opening guaranteed?
- telnet远程登录aaa模式详解【华为eNSP】
- Blocking queue
- 【论文精读】Grounded Language-Image Pre-training(GLIP)
猜你喜欢

【论文精读】Grounded Language-Image Pre-training(GLIP)

Named entity recognition of Chinese electronic medical records based on Roberta WwM dynamic fusion model

Simple encapsulation steps of request data request of uniapp

Shell programming specifications and variables

知识关联视角下金融证券知识图谱构建与相关股票发现

汉字风格迁移篇---对抗性区分域适应(L1)Adversarial Discriminative Domain Adaptation

一篇文章看懂JS执行上下文

@What happens when bean and @component are used on the same class?

uniapp的request数据请求简单封装步骤

Redis
随机推荐
JS 疫情宅在家,学习不能停,七千字长文助你彻底弄懂原型与原型链
基于预训练模型的多标签专利分类研究
Annual comprehensive analysis of China's online video market in 2022
Airport cloud business sign analysis
Construction and empirical research of post talent demand analysis framework based on recruitment advertisement
Detoxify! After Harbin Institute of technology was disabled MATLAB, domestic industrial software fought back domineering
Rtl8762dk environment construction (I)
Slam overview Reading Note 7: visual and visual intangible slam: state of the art, classification, and empirical 2021
Redis
"Game engine light in light out" 4.1 unity shader and OpenGL shader
What you want most is the most comprehensive summary of C language knowledge. Don't hurry to learn
HDU1422 重温世界杯【DP】
Printf function buffer problem
Kubernetes 节点磁盘故障排查
JS什么是声明提前?函数与变量声明提前的先后顺序(执行上下文铺垫篇)
watch VS watchEffect
力扣SQL语句习题,错题记录
This points to problems, closures, and recursion
软件产品第三方测试费用为什么没有统一的报价?
PROFINET simulator tutorial