参考链接:1)https://blog.csdn.net/u014710355/article/details/81513590
2)https://blog.csdn.net/han_better/article/details/81666740#commentBox 这俩是kepserverEx的使用记录,我这里主要当模拟器来用
3)https://blog.csdn.net/qq_41387812/article/details/102745688?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task 这个博主是真的赞,源码连接都给出来了,用来学习opc基础,感jio就很nice
5)https://blog.csdn.net/u014710355/article/details/80688325
6)https://blog.csdn.net/qq_33278354/article/details/104993593 这俩是用VS配置OPC时候容易出的bug解决方案
注:这里是OPC classic的,不是OPC UA的。。。。。。其实我还是蛮倾向于用OPC UA的,毕竟可以跨平台,简直是我这种很少用win开发的福音啊,,,,,,but现在工业上的机器大多比较older,只支持 OPC DA(classic)的,就这样吧,先凑合凑合
一、配置记录
1)查看是否有OPCDAAuto.dll, 在C:/Windows/System32/ (32位) 或C:/Windows/SysWow64/ (64位) 下,具体多少位取决于你想整的工程。如果没有,则安装一下。 Tips:我看别人的教程里都说,安装了VS后自带,但是我重装了下,并没有。。。。。。。
这里我给出我的dll文件安装过程记录以及踩过的坑。
- OPCAutomation 228K大小,32位系统,复制到C:\Windows\System32下,然后管理员身份打开CMD,cd C:\Windows\System32 到目录下,regsvr32.exe OPCAutomation.dll,进行注册。如果是64位系统,要同时对System32和C:\Windows\SysWOW64两个文件夹下进行com注册,然后管理员身份打开CMD,cd到目录下,regsvr32.exe OPCAutomation.dll,注册,注册后重启电脑。
踩坑笔记:
很多人都是按照上面的方法成功了,但是我就是会弹窗:要么是OPCDAAuto.dll 注册失败, 要么是加载成功,但是XXXX没找到啥的......................mmp,就是在搞事情啊,后来我看到了一个大大的方法,写成了bat文件,然后管理员身份运行,ojbk,成功了,下面我贴出这个bat文件的内容
Copy /y OPCDAAuto.dll %windir%\system32\
regsvr32 C:\WINDOWS\system32\OPCDAAuto.dll
务必重启!重启!重启!
2)下载参考链接中博主给的代码,然后用vs2019打开。别怕,直接run。看看报的什么错
这里提示未定义的OPCAutomation.......如果第一步是正常的,就不会出这个问题;如果报这个错误,就说明第一步没有正常注册或者注册后没有重启。。。。。重启后在VS工程里的解决方案中,把这个OPCAutomation的引用删掉,然后重新添加。添加方式如下:
在“解决方案资源管理器”里鼠标右键单击项目,依次选择“添加”→“引用”→“COM”,然后在右上角搜索框搜索“OPC”,然后选择那个带有OPC Automation XXXX的就行了
嗯,然后就基本可以跑起来了,开始你的愉快旅程吧
二、代码学习记录
这里主要是C#的
1.连接服务器
OPCServer KepServer = new OPCServer();
KepServer.Connect(remoteServerName, remoteServerIP);
2.获取服务器状态
KepServer.ServerState == (int)OPCServerState.OPCRunning
3.绑定相关
OPCGroups KepGroups;
KepGroups = KepServer.OPCGroups;
4.订阅(读数据)
KepGroup = KepGroups.Add("MyGroup"); //先添加组
KepGroup.IsSubscribed = true; //设置属性
KepGroup.DataChange += KepGroup_DataChange;//添加订阅事件
//把需要订阅的项添加组
List<string> ItemIds= new List<string>()
{
"S7-1200.0-166.BOOL",
"S7-1200.0-166.BYTE",
"S7-1200.0-166.INT",
"S7-1200.0-166.WORD",
"S7-1200.0-166.REAL",
}
for (int i = 0; i < ItemIds.Count; i++)
{
OPCItem myItem = KepGroup.OPCItems.AddItem(ItemIds[i], i);
}
//订阅函数 ,订阅的内容自定义,这里只是举个栗子
private void KepGroup_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
{
for (int i = 1; i <= NumItems; i++)//下标一定要从1开始,NumItems参数是每次事件触发时Group中实际发生数据变化的Item的数量,而不是整个Group里的Items
{
try{
this.txtTagValue.Text = ItemValues.GetValue(i).ToString();
this.txtQualities.Text = Qualities.GetValue(i).ToString();
this.txtTimeStamps.Text = TimeStamps.GetValue(i).ToString();
}catch(Exception e){
}
}
}
5.异步写
OPCItem bItem = KepItems.GetOPCItem(itmHandleServer);//获取item.itmHandleServer为addItem时返回的句柄
int[] temp = new int[2] { 0, bItem.ServerHandle };
Array serverHandles = (Array)temp;
object[] valueTemp = new object[2] { "", txtWriteTagValue.Text };
Array values = (Array)valueTemp;
Array Errors;
int cancelID;
KepGroup.AsyncWrite(1, ref serverHandles, ref values, out Errors, 2009, out cancelID);
6.断开连接
//用完后请记得断开连接
if (KepGroup != null)
{
KepGroup.DataChange -= new DIOPCGroupEvent_DataChangeEventHandler(KepGroup_DataChange);
}
if (KepServer != null)
{
KepServer.Disconnect();
KepServer = null;
}