OPC通讯协议的机制很容易了解,也是一个非常好用的工具型服务器。由于时间原因简单介绍,具体使用还得自己在objItems、objGroups、tmpCHandles等地方根据自己的配置和需要进行调整,在Array ClientHandles, Array ItemValues变量中进行取值获取机器的工作状态。由于这块儿是我以前调试的,全凭印象简单介绍,有问题可以指出。
OPC服务器的功能就是与下位机进行数据的交换,其中包含了大量的通讯程序和数据存贮程序。然后提供标准的OPC接口,供其它软件使用。程序标准化以后,其他的软件商只需开发面对服务器的程序即可,不用对不同的硬件设备开发不同的硬件驱动程序。减小了工作量,也方便了使用。
Kepserver5.2是工业用的一个很不错的服务器,它不需要上位机程序一直对设备端口进行监控而白白浪费资源,而是通过Datachange的思想,使得数据交换更及时,更轻便,更准确。支持与不同种类的PLC等OPC通讯协议的设备,也支持安卓App的开发。
程序思想在下列函数注释中,
private void connectOPCServer()
{
// (1)创建opc server对象
objServer = new OPCServer();
string strHostIP, strHostName;
//获取本地计算机IP,计算机名称
IPHostEntry IPHost = Dns.GetHostEntry(Environment.MachineName);
if (IPHost.AddressList.Length > 0)
{
strHostIP = IPHost.AddressList[0].ToString();//////如果工控机和笔记本网关发生变化,更改AddressList[1]数值即可
}
else
{
return;
}
//通过IP来获取计算机名称,可用在局域网内
//IPHostEntry ipHostEntry = Dns.GetHostByAddress(strHostIP);
//IPHostEntry ipHostEntry = Dns.GetHostByAddress("192.100.10.124");////本IP地址为工控机或者笔记本的所分配IP
//IPHostEntry ipHostEntry = Dns.GetHostByAddress(ip.Text.Trim());////本IP地址为工控机或者笔记本的所分配IP
try
{
IPHostEntry ipHostEntry = Dns.GetHostByAddress(ip.Text.Trim());////本IP地址为工控机或者笔记本的所分配IP
strHostName = ipHostEntry.HostName.ToString();
CPublic.WriteMsg("成功", ip.Text.Trim());
}
catch (Exception ex)
{
CPublic.WriteMsg("出错", ex.ToString());
}
//strHostName = ipHostEntry.HostName.ToString();
//连接opc server
objServer.Connect("Kepware.KEPServerEX.V5", null);
//textBox6.Text = objServer.GetErrorString;
//(2)建立一个opc组集合
objGroups = objServer.OPCGroups;
//(3)建立一个opc组
objGroup = objGroups.Add(null); //Group组名字可有可无
//(4)添加opc标签设置OPC数据组objGroup的属性
objGroup.IsActive = true; //设置该组为活动状态,连接PLC时,设置为非活动状态也一样
objGroup.IsSubscribed = true; //设置异步通知
objGroup.UpdateRate = 250;
objServer.OPCGroups.DefaultGroupDeadband = 0;
objGroup.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(KepGroup_DataChange);//在数据有变化时候触发事件,完成操作
// objGroup.AsyncReadComplete += new DIOPCGroupEvent_AsyncReadCompleteEventHandler(AsyncReadComplete);
objGroup.AsyncWriteComplete += new DIOPCGroupEvent_AsyncWriteCompleteEventHandler(AsyncWriteComplete);
objItems = objGroup.OPCItems; //建立opc标签集合
string[] tmpIDs = new string[60];
int[] tmpCHandles = new int[60];/////与所监控PLC地址的数量有关系
for (int i = 1; i < 60; i++)
{
tmpCHandles[i] = i;
tmpIDs[i] = "V253.ANDON_V253.ANDON_V253.m" + (i).ToString().PadLeft(2, '0');///获取kepserver 服务器的数值变化,其中162是自定义数目,随着kepserver需要的值而变化
}
strItemIDs = (Array)tmpIDs;//必须转成Array型,否则不能调用AddItems方法
lClientHandles = (Array)tmpCHandles;
// 添加opc标签
objItems.AddItems(55, ref strItemIDs, ref lClientHandles, out lserverhandles, out lErrors, RequestedDataTypes, AccessPaths);//修改值为结构体的前两位数据,第一位是监控地址的个数 //RefreshData();
}