日期:2014-05-18  浏览次数:20797 次

C#与西门子s7-300通讯的问题
如题 ,在读取DB块里面的数据的时候,我用下面这个读没问题,返回一个byte数组:
 [DllImport("W95_s7.dll")] d_field_read
但是如果用下面这个读,读到的数据总是不对啊:
[DllImport("w95_s7.dll")] db_read
  网上给的方法是:
/// 从DB中读取数据
/// 
/// 指定DB块号
/// 指定读取的起始字序号,=0表示DBW0,=1表示DBW2
/// 指定读取的对象有多少个字
/// 返回值
[DllImport("w95_s7.dll")]
private extern static int db_read(int dbno, int dwno, ref int anzahl, ref long buffer);

  感觉这参数是不是介绍的不对?有没有用过的,给我详尽讲讲db_read各个参数的意思,和正确的用法。

------解决方案--------------------
这里给出的声明和你的有点不一样:http://www.cnblogs.com/J0YANG/archive/2009/08/12/1544029.html
不过没看到它的头文件,怎么都不好说。
------解决方案--------------------
对照下他给的英文手册:http://files.cnblogs.com/J0YANG/Prodave.pdf
确实有些小错漏
“1表示DBW2”应为“1表示DBW1”,参数dwno是Word偏移量
“2:DBW , 4:DBD”应为“1:DBW(Int16), 2:DBD(Int32)”,参数anzahl传入需要读和传出实际读的Word数目
他的GetDBInt32Data函数倒是没太大问题,你最好重点参考一下
这个GetDBInt32Data实现的重点在于:整数高位优先和低位优先的转换!经过转换的buffer数组在Intel计算机上才是“正常”的,如果最终需要int,把经过转换的buffer用BitConverter.ToInt再转一下