最近做项目,windows系统的电脑中,布置一个OPC server,该server会去读取PLC的数据。然后电脑中再布置一个OPC客户端,该客户端通过读取本地OPC服务器的数据,间接的采集到PLC中的数据。然后就出现了问题:如果从命令行启动OPC客户端,那么可以读取数据,如果通过nssm安装OPC客户端,那么开机自启后,OPC客户端就读不到数据了。
经过组内讨论,觉得该问题可能会话ID造成的。因为如果OPC客户端通过nssm(或者sc)安装成服务,开机后以服务形式启动,那么会话ID为0,反之则为1,2等数据值。因为这个OPC客户端必须以开机服务的形式启动,因此如果要解决这个问题,可以在服务中以用户进程的形式去创建OPC客户端。创建用户进程使用CreateProcessAsUser。参考网上的案例,实现形式基本如下:
dwSessionID = WTSGetActiveConsoleSessionId();
if (FALSE == WTSQueryUserToken(dwSessionID, &hToken))
{
printf("WTSQueryUserToken fail,error code is %x\n", GetLastError());
bRet = false;
return bRet;
}
// 复制令牌
if (FALSE == DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL,

博客讲述了在Windows系统下,OPC客户端作为服务启动时因会话ID为0导致无法读取PLC数据的问题。通过调整代码,尝试获取有效会话ID并以用户进程方式创建OPC客户端,最终成功实现服务启动后能够正常读取数据。
&spm=1001.2101.3001.5002&articleId=112725221&d=1&t=3&u=503a6cbacbab4c53be33fe064d9007b3)
1538

被折叠的 条评论
为什么被折叠?



