1:这篇文章不讲法兰克的具体采集细节,自从focas1/2开源后,法兰克的采集都烂大街了,随便找找sdk,4.0版本的就可以。我看了一下4.15的以及最新版的focas,除了支持新的系统,如手机版本,以及多了几个函数外,没啥大的改动。用4.0的就可以。
2:法兰克通讯成功后会返回一个句柄,这个就很人性化了,多线程时你可以直接把句柄静态存储下来,然后采集数据 时调用对应设备编号的句柄就可以了。一般采集函数建议写成静态方法,出于线程安全考虑,一般除了通讯句柄,不再调用全局静态变量,装载数据的类等全部在方法内部消化释放。
3:源码:
1:我们先定义一个字典,用来存储句柄:
//定义一个字典用来保存通讯句柄
public static Dictionary<string, ushort> fwlibhandleDic = new Dictionary<string, ushort>();
2:定义通讯函数,将通讯成功句柄保存在字典中
/// <summary>
/// no:设备编号
/// adrip:设备Ip
/// port:设备端口
/// overtime:设备连接时间
/// fwlibhandle:通讯句柄
/// 连接法拉克
/// </summary>
/// <param name="no"></param>
public static bool FConnect(string no, string adrip, ushort port, int overtime)
{
ushort fwlibhandle = 0;
bool returnValue;
short ret = Focas1.cnc_allclibhndl3((object)adrip, port, overtime, out fwlibhandle);
if (ret == Focas1.EW_OK)
{
returnValue = true;
if (fwlibhandleDic.Keys.Contains(no))//如果存在该键,直接为该键赋值
{
fwlibhandleDic[no] = fwlibhandle;
}
else // 如果不存在该键,直接添加
{
fwlibhandleDic.Add(no, fwlibhandle);
}
ErrorCheck(no, "通讯成功!");
}
else
{
if (fwlibhandleDic.Keys.Contains(no))//如果存在该键,直接为该键赋值
{
fwlibhandleDic[no] = 0;
}
else // 如果不存在该键,直接添加
{
fwlibhandleDic.Add(no, 0);
}
returnValue = false;
ErrorCheck(no, "通讯失败,请检查!");
}
return returnValue;
}
然后你给你的设备编号,对应哪个设备,调用哪个句柄即可。
4:排版是我爹!!!!!