使用C#编写CSScript脚本通过IVI.VASA驱动控制仪器
折腾2天时间,由于项目原因,想通过脚本来控制仪器,脚本编写测试方法以及处理测试结果,C# Winform 只需要调用方法获取结果就可以,思来想去,刚开始有限考虑使用python
python:Ironpython
采用Ironpython,该dll目前网上说支持py2,实际测试py3也支持,但有个问题,在调用第三方库的时候,在python 环境下运行各种正常,在C#调用的时候各种错误,sys.path路径各种添加,最后在索引超出范围 range index -1 这个提示失败告终,如果不import visa 就没问题,导入这个插件后 在sys里面的包就会出问题,目前来看应该还是Ironpython 在兼容上存在很大的问题,如果不需要三方库,只需要处理逻辑,比如去重SET之类的python还是非常方便,没办法,选择其他方式
有需要了解python 控制仪器测量的朋友可以了解:https://pyvisa.readthedocs.io/en/stable/
python不行,那就用熟悉的语言来做,整个程序用的C#,那就找找用C#作为脚本引擎的资料,网上一大把,90%都是运行不起来的,但是可以参考下,这个没问题,找资料还是不能光抄写,不懂永远不会懂,现在我将我整理的资料总结下记录:
C#脚本引擎采用Csscript搭建,案例很多,但要找到靠谱的,网上很多方案是在NUget里面搜索以下选择的lib安装即可,实际上这个lIB还不够完善,在使用上还有一定的缺陷,我在其他地方找了一个CSScriptLibrary.dll,引用后使用起来麻利得很,后面会把这些dll下载地址附上
引用完成后,下一步,我们先模拟一个文本内容,内容按照正常的C#格式进行编写
string classCode = @" using Ivi.Visa;
using System;
using System.Windows.Forms;
using Ivi.Visa.FormattedIO;
public class ScriptedClass
{
public IMessageBasedSession mbSession;
public string sie=""sswwws"";
public string HelloWorld {get;set;}
public ScriptedClass()
{
HelloWorld = ""Hello CodeDom!"";
}
public string Test()
{
//System.Diagnostics.Debugger.Break();
HelloWorld = ""Just testing..."";
#if DEBUG
return ""Debug testing"";
#else
return ""Release testing"";
#endif
}
public int se(int a,int x)
{
MessageBox.Show(""Hello World!"");
return a+x;
}
public string sWe()
{
return sie;
}
public string sere()
{
try
{
mbSession = (IMessageBasedSession)GlobalResourceManager.Open(""TCPIP::192.168.9.2::inst0::INSTR"");//连接设备
MessageBasedFormattedIO formattedIO = new MessageBasedFormattedIO(mbSession);
// For Serial and TCP/IP socket connections enable the read Termination Character, or read\'s will timeout
if (mbSession.ResourceName.Contains(""ASRL"") || mbSession.ResourceName.Contains(""SOCKET""))
{
mbSession.TerminationCharacterEnabled = true;
}
formattedIO.WriteLine(""READ:ACP?"");//发送内容
return formattedIO.ReadLine();
}
catch
{
MessageBox.Show(""设备连接失败,请检查!"");
return ""ssd"";
}
}
}";
classCode 就是我们定义的一段文本,string类型,下一步,我们要用CSScript读取这段内容进行解析
var eval = CSScript.CodeDomEvaluator;
dynamic script = eval.LoadCode(classCode);///读取文本内容
script 就已经拿到了文本中ScriptedClass 这个类,接下来,我们想要拿哪个变量或哪个方法都可以像C#一样直接获取即可
var result = script.Test();//拿到类中的TEST方法
script.sie = "222222222222222";//给类中定义的sie变量赋值
这样就完成了脚本的编写,这样我们就可以在脚本里面执行控制仪器的操作,让脚本完成所有和仪器的连接过程测量过程,最后返回我们想要的值
调用仪器驱动需要注意,在官方下载最新的NI仪器驱动,不要在网站上去单独下载,版本不匹配,
Ivi.Visa.dll 即可完成所有和仪器的操作,官方有说明
驱动下载地址http://www.ni.com/download/ni-visa-17.5/7220/en/
调用方法在上段文档里面已经有提到,这里不再重复
附上驱动下载链接:链接:https://pan.baidu.com/s/1uP7drjMevgEqMzpqoCbm4g 密码:xdyo
转载请注明出处,谢谢!