上位机与plc实现通讯指的是什么,plc与上位机通讯过发送数据来控制plc程序去控制机器运转吗?

VB6.0在PLC和上位机通讯中的应用【工控老鬼分享】
VB6.0在PLC和上位机通讯中的应用【工控老鬼分享】
可编程控制器以其高可靠性,配置灵活和完善功能,工业控制系统中到越来越广泛应用。但操作员所需要报表打印、趋势图形显示、工况查寻、参数线修改等功能,PLC却不能直接方便提供。通常采用计算机PC与PLC组成一个完整监控系统。本文以台安TP02系列PLC为例,讨论用Visual
Basic(VB)实现PLC与上位机通讯。
2、VB通讯控件中使用
可编程控制器PLC与上位机PC之间通信,下位机为PLC,基于其可靠性极高,主要承担控制功能,而上位PC机主要承担监察管理功能,兼备部分控制功能,如发出运行,停止命令。VB语言是基于WINDOWS操作系统功能强、易学易用、主面向学习对象程序设计语言。VB带有专门管理串行通讯MSComm控件,只需设置几个主要参数就可以实现PLC与PC串行通讯。要完成通信必须设置MSComm相关属性值:
(1)CommPort:设置或传回通信连接端口代号
(2)Settings:设置初始化参数。以字符串形式设置或传回连接速度、奇偶校验、数据位、停止位等4个参数
(3)PortOpen:设置或传回通信连接端口状态
(4)Input:从输入寄存器传 回并移除字符
(5)Output:将一个字符串写入输出寄存器
(6)InputLen:指定由串行端口读入字符串长度
(7)InBufferCount:传回接收寄存器中字符数
3、软硬件之间:
台安TP02与上位机PC通信时,实现两者通信需要配备通信线。
4、通信程序实现
4.1 通信初始化程序
首先,窗体开始设计之前,添加MSComm控件。
4.2程序编写:
4.2.1 通信控件MSComm1属性设置:
MSComm1.CommPort = 1 设置端口号
MSComm1.Settings = "19200,E,7,2" 设置通信参数
MSComm1.InputLen = 0 设置读入字符串长度
MSComm1.PortOpen = True 设置通信端口状态
4.2.2 PLC运行程序:
STX$ = "::"
TransmitBuf$ = "01?5RUN"
sum$ = CheckSum(transmitBuf$)
ETX$ = Chr$(13)
SXD$ = STX$ + transmitBuf$ + sum$ + ETX$
MSComm1.Output = SXD$
Loop Until MSComm1.InBufferCount &= 12
In1$ = MSComm1.Input
从PLC读取资料,将寄存器内数据资料PC上显示观察监控(反应时间50ms):
STX$ = "::"
transmitBuf$ = "01?5MRVD000102"
sum$ = CheckSum(transmitBuf$)
ETX$ = Chr$(13)
SXD$ = STX$ + transmitBuf$ + sum$ + ETX$
MSComm1.Output = SXD$
Loop Until MSComm1.InBufferCount &= 20
InData$ = MSComm1.Input
Label2.Caption = Mid$(InData$, 10, 4)
Label3.Caption = Mid$(InData$, 14, 4)
4.2.4从PLC读取资料,将RelayC0001状态PC显示进行监控(反应时间50ms):
STX$ = "::"
transmitBuf$ = "01?5MCRC0001"
sum$ = CheckSum(transmitBuf$)
ETX$ = Chr$(13)
SXD$ = STX$ + transmitBuf$ + sum$ + ETX$
MSComm1.Output = SXD$
Loop Until MSComm1.InBufferCount &= 13
In4$ = MSComm1.Input
Coil$ = Mid$(In4$, 10, 1)
C1% = CInt(Coil$)
Label6.Caption = C1%
设定Relay状态,将Relay设定为ON(反应时间50ms):
Dim C1 As Integer
STX$ = "::"
transmitBuf$ = "01?5SCSY00011"
sum$ = CheckSum(transmitBuf$)
ETX$ = Chr$(13)
SXD$ = STX$ + transmitBuf$ + sum$ + ETX$
MSComm1.Output = SXD$
Loop Until MSComm1.InBufferCount &= 12
In2$ = MSComm1.Input
4.2.6 PLC停止运行:
STX$ = "::"
transmitBuf$ = "01?5STP"
sum$ = CheckSum(transmitBuf$)
ETX$ = Chr$(13)
SXD$ = STX$ + transmitBuf$ + sum$ + ETX$
MSComm1.Output = SXD$
Loop Until MSComm1.InBufferCount &= 12
In3$ = MSComm1.Input
4.2.7 VB6.0下CheckSum函数代码如下:
Private Function
CheckSum(transmitBuf$)
L = Len(transmitBuf$)
Dim k, sum As Integer
For k = 1 To L
TJ$ = Mid$(transmitBuf$, k, 1)
Add = Add + Asc(TJ$)
Do While Add &= 256
Add = Add - 256
Add = 255 - Add + 1
tempBuf$ = Hex$(Add)
CheckSum = LTrim(tempBuf$)
End Function
PLC与上位机结合,并VB6.0传送数据所构成计算机监控系统,近距离传输数据现场控制来说是一种性价比很高解决方案。充分利用PLC抗干扰性能和PC强大图形显示,浮点运算特点,与之有效结合,最大限度,合理利用资源
【工控老鬼】友情分享
自动化专业技术博客:
西门子S,人机界面,变频器,运动控制,伺服驱动,WinCC组态监控,自动化系统集成,以及自动化个行业的解决方案。
西门子plc 工业自动化 s 工控老鬼 自动化培训
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。 上传我的文档
 上传文档
 下载
 收藏
粉丝量:748
免责声明: 1,本账号发布文档来源于互联网和个人收集,仅用于技术分享交流用,版权为原作者所有。 2,文档内容纯属来自网络意见,与本账号立场无关。涉及政治言论一律相应删除,请大家监督。 3,请下载试用后二十四小时内删除, 试用后请购买正版的资料或资源。 4,如有关于版权问题,可以联系官方进行删除.
 下载此文档
毕业论文--松下PLC与上位机通讯系统设计
下载积分:1000
内容提示:毕业论文--松下PLC与上位机通讯系统设计
文档格式:DOC|
浏览次数:92|
上传日期: 12:55:16|
文档星级:
全文阅读已结束,如果下载本文需要使用
 1000 积分
下载此文档
该用户还上传了这些文档
毕业论文--松下PLC与上位机通讯系统设计
关注微信公众号PLC与上位机的通信实现_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&100W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
PLC与上位机的通信实现
阅读已结束,下载本文需要
定制HR最喜欢的简历
你可能喜欢上位机与plc实现通讯指的是什么,上位机通过发送数据来控制plc程序去控制机器运转吗?_百度知道
上位机与plc实现通讯指的是什么,上位机通过发送数据来控制plc程序去控制机器运转吗?
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
来自电脑网络类芝麻团
采纳数:243
获赞数:127
参与团队:
plc的通信协议都是自己研发的内部协议,基本上每家都不同。你可以尝试以下几种办法:plc厂家出的驱动、opc第三方OPC我有通信组件(dll文件)出售
老哥你再说些什么哦
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。上位机与PLC通讯及OPC数据采集实践一
上位机与PLC通讯及OPC数据采集实践一
由于项目的需要,上位机(工控机)需要与PLC通讯(AB的PLC)通过PLC控制相关的设备;另一部分需要做一个数据采集程序从一个OPC服务器(此服务器作为多个PLC数据的服务端用的是AB的RsLinx)采集一部分PLC的数据供另一个应用程序用。
由于之前没有接触过PLC,也没有听说过什么OPC,所以从网上找些资料,由于做的时候实际的环境可以调试,很多东西在写的时候都没啥底,最后在现场调试的时候有些东西才搞清楚,整个过程还是费了些周折,有些东西虽然还是没有完全弄懂,但基于这个项目的基本功能算是完成了。所以记录下来,以便以来有可能用得着,也给初次接触这块的同学提供些参考。
上位机与PLC的通讯
上位机基于C#写的,PLC是AB的,C#程序通过串口(RS232-485转换器)与PLC通讯,协议用的是标准modbus,程序发指令给PLC,PLC来控制电磁阀,继电器等工作。由于PLC本身没有采集数据,上位机还要把采集到的数据写到PLC,数据原本是float的,但传给PLC时转成small
int(小于65536)的整数,PLC内部再作除法来还原float数据.
这部分基于串口通读,modbus协议倒时没费啥事。串口通讯可以用串口调试助手测试;
至于写数据有没有写成功可以用 ModScan32来看,连上对应的串口,设置好波特率,从机地址就可以看到默认100个寄存器的值。
PLC还有一个I/O口是编程用的,连接后用rslogix可以查看实时的状态,不过不大会用,看到PLC编程的工程师是这么用的。
数据采集程序与OPC服务器的通讯与数据采集
数据采集程序与OPC服务器在同一局域网,但不同网段,可以Ping通,但在程序里就是连不上OPC服务器,提示RPC服务器不可用。在网上找资料说是要配置服务端及客户端的DCOM,于是照网上的方式把客户端的机器设置DCOM,但服务端控制不了,对方的工程师说已经配置好了,但死活还是连不上,提示还是一样。(所以远程访问的方式还是没有走通)
后来经过协商把采集程序安装到OPC服务器所在的机器上,在同一网段内果真可以连上,数据采集也没有问题,估计开始还是网络及权限方面的问题;采集程序也是根据网上找的改的,后面附上源码。数据采集到后,通过socket发到另一台机器。
采集程序源码如下:(C# vs2010)
引用 OpcNetApi.dll
OpcNetApi.Com.dll
这两个dll在安装Rslinx后安装目录下可以找到 ***\Rockwell Software\RSLinx\下
-----------------code begin--------------
using System.Collections.G
using System.L
using System.T
using System.T
using Opc.Da;
using OpcC
namespace OPC
/// &summary&
/// opc服务器数据采集类
/// &/summary&
public class OPCSampling
private Opc.Da.Server m_server =//定义数据存取服务器
private Opc.Da.Subscription subscription1 =//定义组对象(订阅者)
private Opc.Da.SubscriptionState state1 =//定义组(订阅者)状态,相当于OPC规范中组的参数
private Opc.IDiscovery m_discovery = new OpcCom.ServerEnumerator();//定义枚举基于COM服务器的接口,用来搜索所有的此类服务器。
/// &summary&
/// 类的启动函数,供外部调用
/// &/summary&
public void Work(string strHost,string strOPCServerName)
//查询服务器
Opc.Server[] servers = m_discovery.GetAvailableServers(Specification.COM_DA_20, strHost, null);
//daver表示数据存取规范版本,Specification.COMDA_20等于2.0版本。
//host为计算机名,null表示不需要任何网络安全认证。
if (servers != null)
//连上后在这里看下OPC服务的名称,记下来在系统配置里更改opc服务器服务名,重启程序再运行
SharedLibrary.Gloary.OPCServerList = "";
foreach (Opc.Da.Server server in servers)
SharedLibrary.Gloary.OPCServerList += server.Name + " \r\n";
//server即为需要连接的OPC数据存取服务器。
if (String.Compare(server.Name, strOPCServerName, true) == 0)//为true忽略大小写
m_server =//建立连接。
if (SharedLibrary.Gloary.OPCServerList.Length & 1)
SharedLibrary.Gloary.OPCServerList = "未连接上OPC服务器或没有找到相应的OPC服务";
//连接服务器
if (m_server != null)//非空连接服务器
m_server.Connect();
//设定组1状态
state1 = new Opc.Da.SubscriptionState();//组(订阅者)状态,相当于OPC规范中组的参数
state1.Name = "OPCDataSampling1";//组名
state1.ServerHandle =//服务器给该组分配的句柄。
state1.ClientHandle = Guid.NewGuid().ToString();//客户端给该组分配的句柄。
state1.Active =//激活该组。
state1.UpdateRate = 30000;//刷新频率为1秒。
state1.Deadband = 0;//
死区值,设为0时,服务器端该组内任何数据变化都通知组。
state1.Locale =//不设置地区值。
subscription1 = (Opc.Da.Subscription)m_server.CreateSubscription(state1);//创建组1
//定义Item列表
//对应类型为:{Byte,Byte,Char,Short,String,Word,Boolean}
string[] itemName = { "[27]F8:8", "[27]F8:9", "[21]F8:1", "[21]F8:2", "[24]N9:0", "[21]F8:4", "[25]F8:1", "[25]F8:0", "[25]F8:5" };
//定义item列表
Item[] items = new Item[9];//定义数据项,即item
for (i = 0; i & items.L i++)//item初始化赋值
items[i] = new Item();//创建一个项Item对象。
items[i].ClientHandle = Guid.NewGuid().ToString();//客户端给该数据项分配的句柄。
items[i].ItemPath = //该数据项在服务器中的路径。
items[i].ItemName = itemName[i]; //该数据项在服务器中的名字。
//添加Item
subscription1.AddItems(items);
//注册回调事件
subscription1.DataChanged += new Opc.Da.DataChangedEventHandler(this.OnDataChange1);
////以下测试同步读
////以下读整个组
//ItemValueResult[] values = subscription1.Read(subscription1.Items);
////以下遍历读到的全部值
//foreach (ItemValueResult value in values)
SharedLibrary.Gloary.OPCServerList += "ItemName=" + value.ItemName + "\r\n";
SharedLibrary.Gloary.OPCServerList += "ItemValue=" + value.Value.ToString() + "\r\n";
SharedLibrary.LogMs.Debug("ItemName=" + value.ItemName);
SharedLibrary.LogMs.Debug("ItemValue=" + value.Value);
#endregion
////取消回调事件
//subscription.DataChanged -= new Opc.Da.DataChangedEventHandler(this.OnDataChange);
////移除组内item
//subscription.RemoveItems(subscription.Items);
////结束:释放各资源
//m_server.CancelSubscription(subscription);//m_server前文已说明,通知服务器要求删除组。
//subscription.Dispose();//强制.NET资源回收站回收该subscription的所有资源。
//m_server.Disconnect();//断开服务器连接
catch (Exception ex1)
SharedLibrary.Gloary.OPCServerList += "
异常:"+ex1.Message.ToString();
/// &summary&
/// DataChange回调
/// &/summary&
/// &param name="subscriptionHandle"&&/param&
/// &param name="requestHandle"&&/param&
/// &param name="values"&&/param&
public void OnDataChange1(object subscriptionHandle, object requestHandle, ItemValueResult[] values)
//OnDataChangeDeal("1", subscriptionHandle, requestHandle, values);
string siteID = "";
MonitorCenterWS60.BLL.SiteBaseEMData bll = new MonitorCenterWS60.BLL.SiteBaseEMData();
foreach (ItemValueResult item in values)
MonitorCenterWS60.Model.SiteBaseEMData model = new MonitorCenterWS60.Model.SiteBaseEMData();
针对itemname作数据处理
switch (item.ItemName)
case "[27]F8:8":
siteID = "01";
model.ItemCode = "160";
model.ItemValue = decimal.Parse(decimal.Parse(item.Value.ToString()).ToString("0.000"));
model.Memo = item.ItemN
case "[27]F8:9":
siteID = "01";
model.ItemCode = "161";
model.ItemValue = decimal.Parse(decimal.Parse(item.Value.ToString()).ToString("0.00"));
model.Memo = item.ItemN
#endregion
if (SharedLibrary.Gloary.DataTransType == "1")
DataComm.DataSend.SendEMDataReal(model);
#endregion
/// &summary&
/// ReadComplete回调
/// &/summary&
/// &param name="requestHandle"&&/param&
/// &param name="values"&&/param&
public void OnReadComplete(object requestHandle, Opc.Da.ItemValueResult[] values)
/*Console.WriteLine("发生异步读name:{0},value:{1}", values[0].ItemName, values[0].Value);
if ((int)requestHandle == 1)
Console.WriteLine("事件信号句柄为{0}", requestHandle);*/
/// &summary&
/// WriteComplete回调
/// &/summary&
/// &param name="requestHandle"&&/param&
/// &param name="values"&&/param&
public void OnWriteComplete(object requestHandle, Opc.IdentifiedResult[] values)
/*Console.WriteLine("发生异步写name:{0},value:{1}", values[0].ItemName, values[0].GetType());
if ((int)requestHandle == 2)
Console.WriteLine("事件信号句柄为{0}", requestHandle);*/
-----------------code end-----------------
需要注意的是服务名与item标签名一定要对,这个也可以用opc client来测试下,Rslinx提供了这个工具
在RxLinx/tools
里面有个 OPC Test Clent 打开后,添加组,再添加标签,也可以从下方的里面选择现有的数据项,添加后可以查看到实时数据;
疑问一:因为没有用RsLinx配置过OPC服务器,没明白OPC服务器上的数据项(server下面的group下的item)在哪配置,待搞清楚后再来更新,如果有知道的也请不吝赐教!!!谢谢!
基于opc架构的数据采集系统及应用
通过OPC读写PLC数据
plc数据采集初探
Python OpenOPC的学习观感
VC++与OPC(pc access)通讯
运用C#编程通过OPC方式实现PC机与西门子PLC通讯 --异步通讯篇
KEPServerEx OPC 读取西门子 PLC S7200 SMART的数据
没有更多推荐了,

我要回帖

更多关于 plc与vb上位机通讯 的文章

 

随机推荐