You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

88 lines
4.0 KiB
C#

2 months ago
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace Mesnac.Equip.Siemens.S7.Default
{
/// <summary>
/// 西门子S7-300PLC串口通讯接口类
/// </summary>
public class W95_S7
{
/*
PAdressType = ^AdressType;
AdressType = packed record
Adress : Char; // stationsadresse default 2
SegmentId : Char; // segment id default 0
SlotNo : Char; // slot no default 1
RackNo : Char; // rack no default 0
end;
function load_tool(a:char; b:PChar; c:PAdressType):integer;stdcall;external'W95_S7.dll';
function db_read(a,b:integer;var c:integer;d:pointer): Integer;stdcall;external'W95_s7.dll';
function db_write(a,b:integer;var c:integer;d:pointer):integer;stdcall;external'W95_s7.dll';
function unload_tool():integer;stdcall;external'W95_s7.dll';
*/
/// <summary>
/// 定义MPI链接参数
/// </summary>
public struct PLCConnParam
{
/// <summary>
/// 定义CPU的MPI地址
/// </summary>
public byte Adress;
//public byte SegmentId; //保留为0
/// <summary>
/// 定义CPU的机架号
/// </summary>
public byte RackNo;
/// <summary>
/// 定义CPU的槽号
/// </summary>
public byte SlotNo;
}
/// <summary>
/// 与PLC建立连接,该函数必须在其他所有函数调用之前被调用
/// 在一个MPI网络中若有多个CPU时可指定多个连接列。最后一列的所有参数须置0以标志参数列结束。
/// e.g.一个MPI网中有两个CPU,他们的MPI地址分别为2和3槽号均为2机架号均为0则可按如下方式调用:
/// byte[,] btr={{2,0,2,0},{3,0,2,0},{0,0,0,0}}; int err=load_tool(1, "s7online",btr);
/// </summary>
/// <param name="nr">连接数,在DOS,WIN3.1最多可以有4个,在WIN95以上最多可以有16个</param>
/// <param name="device">与PLC通讯的设备名称,一般为S7ONLINE</param>
/// <param name="adr_table">参数列表,4个值分别为MPI/DP地址,保留值=0,槽号,机架号</param>
/// <returns>0正常返回,非0为错误号</returns>
[DllImport("W95_S7.dll")]
public extern static int load_tool(byte nr, string device, byte[,] adr_table);
/// <summary>
/// 从DB中读取ushort数组(长度是WORD倍数,即双BYTE)
/// </summary>
/// <param name="dbno">DB块号</param>
/// <param name="dwno">DBW起始编号,=0表示DBW0,=1表示DBW2,跨度为WORD</param>
/// <param name="anzahl">读取的WORD长度(1个WORD==2个BYTE)</param>
/// <param name="buffer">返回值,ushort型buffer</param>
/// <returns>0正常返回,非0为错误号</returns>
[DllImport("W95_S7.dll")]
public extern static int db_read(int dbno, int dwno, ref int anzahl, ushort[] buffer);
/// <summary>
/// 向DB数据块中写入数据
/// </summary>
/// <param name="dbno">指定DB块号</param>
/// <param name="dwno">指定写入的起始字序号,=0表示DBW0,=1表示DBW2</param>
/// <param name="anzahl">指定写入的对象有多少个字</param>
/// <param name="buffer">写入值</param>
/// <returns>0正常返回,非0为错误号</returns>
[DllImport("W95_S7.dll")]
public extern static int db_write(int dbno, int dwno, ref int anzahl, ushort[] buffer);
/// <summary>
/// 断开与PLC的连接,必须在退出软件之前调用,否则PLC的连接一直被占用,影响下次连接
/// </summary>
/// <returns>0正常返回,非0为错误号</returns>
[DllImport("W95_S7.dll")]
public extern static int unload_tool();
}
}