〔西门子通讯〕SAPI_S7 com版本接口
熟悉自动控制的朋友,一定会了解西门子的。西门子的SAPI_S7 编程接口可以实现普通PC机利用以太网连接西门子PLC的功能。这样就可以通过高级语言(C、C++)编程,达到操作PLC的目的。不过这个api是一个c语言接口,用其他语言调用c语言库显的很不方便;我自己用平时用c#多一些,在c#中调用这个api就牵涉到了数据封送的问题,处理起来相当烦琐;所以,干脆做个com库,最起码在win平台下,大部分主流编程语言都可以调用这个库了。
我的基本思路是:在com中调用sapi_s7接口,把与语言相关的数据类型(c语言的指针、结构)在com中预处理一遍,处理后再输出就可以了。
片断:S7_READ_PARA 结构体的修改
[uuid(DCA5D958-C381-43A0-9BDB-000000000000)]
struct S7_READ_PARA
{
ord16 access;
LPSTR var_name;
ord16 index;
ord16 subindex;
ord16 address_len;
byte address[S7_MAX_ADDRESSLEN];
};
片断:接口的定义
interface Isapi_s7com : IDispatch{
[id(1), helpstring("方法get_vfd")] HRESULT get_vfd([in]LPSTR dev_name, ord16 index, [in,out] ord16* number_ptr, [in,out,size_is(33)] LPSTR* vfd_name, [out,retval] int32* ret);
[id(2), helpstring("方法init")] HRESULT init(LPSTR cp_name, LPSTR vfd_name, [in,out] ord32 * cp_descr_ptr,[out,retval] int32* ret);
[id(3), helpstring("方法get_device")] HRESULT get_device(ord16 index, [in,out] ord16 * number_ptr, [in,out] LPSTR* dev_name, [out,retval] int32* ret);
[id(4), helpstring("方法abort")] HRESULT abort(ord32 cp_descr, ord16 cref, [out,retval] int32 * ret);
[id(5), helpstring("方法await_initiate_req")] HRESULT await_initiate_req(ord32 cp_descr, ord16 cref, [out,retval] int32* ret);
......
[id(59), helpstring("方法write_trace_buffer")] HRESULT write_trace_buffer(LPSTR filename);
[id(60), helpstring("方法get_read_cnf")] HRESULT get_read_cnf( [in,out] ord16* var_length_ptr, [in,out] VARIANT* value_ptr,[out,retval] int32* ret);
[id(61), helpstring("方法get_read_cnf_byte")] HRESULT get_read_cnf_byte( [in,out] ord16* var_length_ptr, [in,out] ord16* value_ptr, [out,retval] int32* ret);
};
完整的IDL文件下载:sapis7com.idl
DLL文件下载:sapis7com.dll
下载后请将后缀txt去掉
使用注意事项:使用前需用regsrv32注册com组件,然后就可以在程序中调用控件了。
程序需要配合Simatic Net使用。
本程序在 C#、Delphi中测试成功。
编译环境:windowXP Sp3 + visual Studio 2008
测试环境:windowXP Sp3 + visual Studio 2008 / Delphi 2003 + Simatic Net 2005 + s7 300 PLC
不错@admin
你好 可不可以请教一下您做的例子呢?
您好,关于这个主题很感兴趣,目前正在研究c# 与 sapi_s7 通讯,可否请教下您做的c# 例子吗?非常感谢
email : dancingqueen@yeah.net
已发至邮箱
非常感谢!已经收到了,拜读下大神的代码········· 不明白西门子为什么不出c#的dll,还是大神厉害!!!支持
你好,想学习一下SAPI-S7的知识,可惜实例太少,能不能学习一下您做的实例?万谢~~~~~
已发至邮箱
已收到,多谢大神,拜读一下您写的程序~~~~~~
^_^,siemens对于PLC与PC间通讯有更新的方式,具体可搜下西门子工业官网
大神,最新的通讯方式叫什么名字,我想找一种不需要安装其它软件,直接读写plc中数据的方法,我见过类似的例子,不过没有源程序,不知道人家怎么实现的?
你说的最新的方式不是opc吧,用opc需要配置opcserver,太复杂,最近我发现一个叫libnodave开源库,貌似比prodave和sapi_s7更强大,但是不是西门子官方的,虽然免费,但总是不太放心,万一出故障,就是大事故啊~~~~
大神你可以研究一下~~~~
我也下载了 libnodave 代码,有c#的,但是只支持win32 的,我是win7 64位的,暂时没有办法进行测试(dll文件没有办法导入),打算安装虚拟机进行测试。软件设置里面可以选择 s7 协议/ tcp libnodave协议 /好像还有串口,这个东西 还有安卓手机版本的,呵呵。但是网上相关的文档说明还没有下载下来,不清楚里面的函数具体怎么用。
大神可以研究下。
前两个月,我分别使用了串口以及opc两种方式通过上位机获取西门子plc中的数据。安装simatic net 软件,配置好opc server后,采用异步方式在上位机应用中出现了偶尔有些数据没有接收到的情况,但是相对于串口速度快。随后转向串口通讯,plc为siemens的pc477,串口采用wago的750-650模块,波特率为9600,但是实际测试接收到50个字节所用的时间为600ms左右,感觉与波特率相差较远,可能与plc扫描周期有关(平均周期11ms,感觉一个周期发送了一个字节),具体原因不清楚,打算使用西门子自家的串口模块进行测试串口速度。
目前为了避免上面两种方式的缺点,打算研究以太网方式通讯……希望得到大家的支持……… dancingqueen@yeah.net
一般实际工业应用中,多用成熟的OPC Server(二级通讯),我也见过有公司自己开发的接口,底层还是调用的OPC server,工业软件稳定第一,所以这是为什么不再研究这个的原因。
另外,我在实际使用S7_Sapi时,发现它无法与plc建立持久连接,如果PC不再发送消息,那么过段时间plc会自动断开连接。
再次连接则有一个1s左右的延迟,这对于实时性要求高的系统是不符合要求的。因为它把太多时间消耗在连接的建立上。
另,PLC的扫描周期太快了,opc多用于二级,不需要过快的周期。如果是轧线,貌似老外用的是自己的东西,delpi编的
请问大神有c# 调用您开发的这个dll 的例子,可以转给我邮箱吗?谢谢!
您好,关于这个主题很感兴趣,目前正在研究c# 与 sapi_s7 通讯,可否请教下您做的c# 例子吗?
16798664@qq.com
你好,这个是早期的东西,根据现场实践,推荐用OPC,SAPI_S7接口过于旧了,相关资料太少了
你好,看到这方面的信息非常开心,能否分享一下c#的代码呢?谢谢。我的邮箱:407749947@qq.com
你好,这个是早期的东西,根据现场实践,推荐用OPC,SAPI_S7接口过于旧了,相关资料太少了
你好 我想问一下:apache 的 htaccess
我想做到
访问:
localhost/项目名称/index.php/test/hello
localhost/项目名称/test/hello
都可以达到,传入index.php一个数组变量:
Array ( [_url] => test/hello )
我该怎么写规则?
现在我就是
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?_url=$1 [QSA,PT,L]
做不到 输入index.php的时候收到这个数组。
请指点一下。
楼主你好,我对你用C#调用sapi-s7 COM件访问PLC很感兴趣,我用你转的COM件添加到工程中,函数第一次运行的时候没有问题,但是运行多次会弹出非法访问的错误,不知道是什么原因,很希望您能够给我指点,能把您做的源码发我一份不胜感激。我之前用的是C语言测试的sapi-s7函数库,尝试建立连接后很久之后再对PLC进行读写,并没有发现有连接断开的现象,另我对sapi-s7的速度进行了测试,发现sapi-s7对PLC的读写速度挺快的。如果走以太网,smart 200 的读写200字节基本在3ms左右,1200基本在15ms左右,300由于是挂了个以太网模块在40ms左右。其他网络也进行了测试,速度的话基本是以太网<PROFIBUS<MPI.还想和楼主进一步交流,有兴趣的话希望楼主能给我回个邮件,谢谢!邮箱是15527942585@163.com
感谢支持,SAPI_S7接口较老,目前我已经不再使用,推荐使用libnodave
能不能把你这个DLL的使用示例发我看看,C#的
SAPI_S7接口已经过时,推荐使用Libnodave
能不能把你这个DLL的使用示例发我看看,C#的,不胜感激
这个接口很老了,现在已经弃用