SCLS/SSWCS_JXDL(2019)/SimensMpi/CSimensCP5611.cs

474 lines
18 KiB
C#
Raw Normal View History

2025-05-19 09:45:29 +08:00
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using Microsoft.VisualBasic;
using CommonClassLib;
namespace SimensCP5611
{
/// <summary>
/// Richard.liu 2008
/// 西门子PLC S7-300的MPI通讯的静态类,不需要构造和5611卡的初始化;
/// 网络通讯产生的错误记录在ErrorsText属性中
/// </summary>
public static class CSimensCP5611
{
static bool IfInit = false;
/*'****************************************************************************************************************************
'variables for program
'****************************************************************************************************************************
*/
static int InitCount = 0;
public static int CP5611InitCount
{
get { return CSimensCP5611.InitCount; }
set { CSimensCP5611.InitCount = value; }
}
static uint[] value_word = new uint[200];
static byte[] value_byte = new byte[200];
static int res;
static int BLOCKNO=0;
static string Errors;
/// <summary>
/// 与mpi网络通讯的故障信息
/// </summary>
public static string ErrorsText
{
get { return Errors; }
set {Errors=value ;}
}
[DllImport("W95_s7.dll")]
static extern int load_tool(byte nr, string dev, byte[,] adr);
/*'****************************************************************************************************************************
'declarations for S7-300/400
'****************************************************************************************************************************
*/
[DllImport("W95_s7.dll")]
static extern int new_ss(byte no);
[DllImport("W95_s7.dll")]
public static extern int unload_tool() ;
//[DllImport("W95_s7.dll")]
//static extern int ag_info(infotyp value );
[DllImport("W95_s7.dll")]
static extern int ag_zustand(ref byte value);
[DllImport("W95_s7.dll")]
static extern int db_buch(ushort[] value);
/*' blockno, no, amount, value*/
[DllImport("W95_s7.dll")]
static extern int db_read(int db, int dw, int anz,ref uint value);
[DllImport("W95_s7.dll")]
static extern int db_write(int db , int dw , int anz ,ref int value );
[DllImport("W95_s7.dll")]
static extern int d_field_read(int db, int nr , int anz ,ref byte value);
[DllImport("W95_s7.dll")]
static extern int d_field_write(int db , int nr , int anz ,ref byte value ) ;
//'no, amount, value
[DllImport("W95_s7.dll")]
static extern int e_field_read(int nr , int anz , ref byte value ) ;
[DllImport("W95_s7.dll")]
static extern int a_field_read(int nr,int anz ,ref byte value);
[DllImport("W95_s7.dll")]
static extern int a_field_write(int nr , int anz , ref byte value);
[DllImport("W95_s7.dll")]
static extern int m_field_read (int nr, int anz, ref byte value);
[DllImport("W95_s7.dll")]
static extern int m_field_write(int nr, int anz, ref byte value);
[DllImport("W95_s7.dll")]
static extern int t_field_read (int nr, int anz, int value);
[DllImport("W95_s7.dll")]
static extern int z_field_read (int nr, int anz, int value);
[DllImport("W95_s7.dll")]
static extern int z_field_write (int nr, int anz, int value);
//' data, value
//[DllImport("W95_s7.dll")]
//static extern int mix_read (mixdatatype data , byte value);
//[DllImport("W95_s7.dll")]
//static extern int mix_write (mixdatatype data , byte value);
//' no, bitno
[DllImport("W95_s7.dll")]
static extern int mb_setbit (short no, short bitno);
[DllImport("W95_s7.dll")]
static extern int mb_resetbit (short no, short bitno);
//' no, bitno, value
[DllImport("W95_s7.dll")]
static extern int mb_bittest (short no, short bitno, ref short value);
/*'****************************************************************************************************************************
'declarations for TeleService
'****************************************************************************************************************************
'modem name, standort name, tel.no, username, password , window handel, message, wparam
*/
[DllImport("W95_s7.dll")]
static extern int ts_dial (string ModemName , string StandortName , string TelNo , string UserName , string Password , int Handle, int Message, int WParam , string res1 );
[DllImport("W95_s7.dll")]
static extern int ts_hang_up_dial ();
//'set indicaton on ring -> message if ts-adapter is connected
//'modem name, no of rings, window handel, message, wparam
[DllImport("W95_s7.dll")]
static extern int ts_set_ringindicator (string ModemName , int Rings, int Handle, int Message, int WParam, string res1 );
//'information from ring connected ts-adapter
//'userid (16 bytes) , asid (1 byte)
[DllImport("W95_s7.dll")]
static extern int ts_read_info (byte value,byte MPIAdr );
[DllImport("W95_s7.dll")]
static extern int ts_hang_up_ring ();
//'modem no, modem name, modem name len
[DllImport("W95_s7.dll")]
static extern int ts_get_modem_name (int no, string ModemName ,int ModemNameLen );
/*'****************************************************************************************************************************
'declarations for komfort.dll
'****************************************************************************************************************************
'errorno, errortext
*/
[DllImport("komfort.dll")]
static extern int error_message (int nr,object value);
//'buffer, amount bytes
[DllImport("komfort.dll")]
static extern void swab_buffer (int value, int anz );
/// <summary>
/// 初始化CP5611卡
/// </summary>
/// <returns>true初始化成功false失败</returns>
static bool InitMpi()
{
byte[,] btr = new byte[2, 4];
btr[0, 0] = 2;//连接1中PLC的起始地址
btr[0, 1] = 0;//SEGMENTID
btr[0, 2] = 2;//SLOTNO
btr[0, 3] = 0;//RACKNO
btr[1, 0] = 0;//连接2中PLC的起始地址
btr[1, 1] = 0;//SEGMENTID
btr[1, 2] = 0;//SLOTNO
btr[1, 3] = 0;//RACKNO
if (InitCount > 3)
{
Errors = "Profibus总线卡CP5611已经三次初始化失败总线通讯失败请退出系统检查总线网络";
return false;
}
res = load_tool(1, "S7ONLINE", btr); //'考虑什么时候调用unload_tool()
if (res != 0)
{
ErrMpi();
InitCount++;
return false;
}
else
IfInit = true;
return true;
}
/// <summary>
/// //'向指定连接connNo的DataTypeIdx数据存储区写入数据
/// </summary>
/// <param name="connNo">连接编号</param>
/// <param name="DataTypeIdx">数据存储区的类型DataTypeIdx=2是Flag(M区)</param>
/// <param name="addrno">开始地址</param>
/// <param name="AMOUNT">写入的个数</param>
/// <param name="value_byte">写入的字节型数组数据</param>
/// <returns></returns>
///
public static bool write_CP5611(byte connNo, int DataTypeIdx,int addrno,int AMOUNT, byte[] value_byte)
{
try
{
if (IfInit != true)
{
if (InitMpi() == false)
{
return false;
}
}
res = new_ss(connNo);
if (res == 0)
{
switch (DataTypeIdx)
{
case 1:
res = a_field_write(addrno, AMOUNT,ref value_byte[0]);
//CCarryConvert.WriteDarkCasket("SimensCP5611.CSimensCP5611", "a_field_write", addrno.ToString(), value_byte);
break;
case 2:
res = m_field_write(addrno, AMOUNT,ref value_byte[0] );//'Flag数据类型
//CCarryConvert.WriteDarkCasket("SimensCP5611.CSimensCP5611", "m_field_write", addrno.ToString(), value_byte);
break;
case 7:
res = d_field_write(BLOCKNO, addrno, AMOUNT,ref value_byte[0]);
//CCarryConvert.WriteDarkCasket("SimensCP5611.CSimensCP5611", "d_field_write", BLOCKNO.ToString() + ":" + addrno.ToString(), value_byte);
break;
default :
res = 33028;
break;
}
}
if (res != 0)
{
ErrMpi();
return false;
}
return true;
}
catch(Exception ex)
{
Errors = ex.Message;
return false;
}
}
/// <summary>
/// 向MPI通讯缓冲区DB区的写入数据
/// </summary>
/// <param name="connNo">连接编号</param>
/// <param name="dbNo">DB数据块编号</param>
/// <param name="addrDW">写DB数据块的DW数据的开始地址</param>
/// <param name="AMOUNT">写入数量</param>
public static bool DBwrite_CP5611(byte connNo,int dbNo, int nr, int AMOUNT, byte[] value)
{
try
{
if (IfInit != true)
{
if (InitMpi() == false)
{
return false;
}
}
res = new_ss( connNo);
if (res == 0)
{
res =d_field_write(dbNo, nr,AMOUNT,ref value[0]);
//CCarryConvert.WriteDarkCasket("SimensCP5611.CSimensCP5611", "d_field_write", dbNo.ToString() + ":" + nr.ToString(), value);
}
if (res != 0)
{
ErrMpi();
return false;
}
return true;
}
catch (Exception ex)
{
Errors = ex.Message;
return false;
}
}
/// <summary>
/// //'读出MPI通讯缓冲区的数据
/// </summary>
/// <param name="connNo">连接编号</param>
/// <param name="DataTypeIdx">数据存储区的类型DataTypeIdx=2是Flag(M区)</param>
/// <param name="addrNo">开始读数据的地址</param>
/// <param name="AMOUNT">读取数量</param>
/// <returns>所有字节型数组</returns>
public static byte[] read_CP5611(byte connNo,int DataTypeIdx,int addrNo,int AMOUNT)
{
try
{
if (IfInit != true)
{
if (InitMpi() == false)
{
return null;
}
}
if (AMOUNT > 512)
AMOUNT = 512;
res = new_ss( connNo);
if (res == 0)
{
switch (DataTypeIdx)
{
case 0:
res = e_field_read(addrNo, AMOUNT,ref value_byte[0]);
//CCarryConvert.WriteDarkCasket("SimensCP5611.CSimensCP5611", "e_field_read", addrNo.ToString(), value_byte);
break;
case 1:
res = a_field_read(addrNo, AMOUNT,ref value_byte[0]);
//CCarryConvert.WriteDarkCasket("SimensCP5611.CSimensCP5611", "a_field_read", addrNo.ToString(), value_byte);
break;
case 2:
res = m_field_read(addrNo, AMOUNT,ref value_byte[0]);// 'Flag数据类型
//CCarryConvert.WriteDarkCasket("SimensCP5611.CSimensCP5611", "m_field_read", addrNo.ToString(), value_byte);
break;
case 3:
break;
case 4:
break;
case 5:
res = 33028;
break;
case 6:
res = 33028;
break;
case 7:
res = d_field_read(BLOCKNO, addrNo, AMOUNT,ref value_byte[0]);
//CCarryConvert.WriteDarkCasket("SimensCP5611.CSimensCP5611", "d_field_read", BLOCKNO.ToString() + ":" + addrNo.ToString(), value_byte);
break;
}
}
if (res != 0)
{
ErrMpi();
return null;
}
else
{
return value_byte;
}
}
catch (Exception ex)
{
Errors = ex.Message;
return null;
}
}
/// <summary>
/// //'读出MPI通讯缓冲区DB区的数据
/// </summary>
/// <param name="connNo">连接编号</param>
/// <param name="dbNo">DB数据块编号</param>
/// <param name="addrDW">读DB数据块的DW数据的开始地址</param>
/// <param name="AMOUNT">读取数量</param>
/// <returns>所有字节型数组</returns>
public static byte[] DB_Read_CP5611( byte connNo, int dbNo, int nr, int AMOUNT)
{
try
{
if (IfInit != true)
{
if (InitMpi() == false)
{
return null;
}
}
if (AMOUNT > 512)
AMOUNT = 512;
res = new_ss(connNo);
if (res == 0)
{
res =d_field_read(dbNo, nr, AMOUNT, ref value_byte[0]);
//CCarryConvert.WriteDarkCasket("SimensCP5611.CSimensCP5611", "d_field_read", dbNo.ToString() + ":" + nr.ToString(), value_byte);
}
if (res != 0)
{
ErrMpi();
return null;
}
else
{
return value_byte;
}
}
catch (Exception ex)
{
Errors = ex.Message;
return null;
}
}
/// <summary>
/// //'读出MPI通讯缓冲区DB区的数据
/// </summary>
/// <param name="connNo">连接编号</param>
/// <param name="dbNo">DB数据块编号</param>
/// <param name="addrDW">读DB数据块的DW数据的开始地址</param>
/// <param name="AMOUNT">读取数量</param>
/// <param name="Bit">比特(位数)</param>
/// <returns>所有字节型数组</returns>
public static byte[] DB_Read_CP5611(byte connNo, byte dbNo, int nr, int AMOUNT,int Bit)
{
try
{
if (IfInit != true)
{
if (InitMpi() == false)
{
return null;
}
}
if (AMOUNT > 512)
AMOUNT = 512;
res = new_ss( connNo);
if (res == 0)
{
res =d_field_read (dbNo, nr, AMOUNT,ref value_byte[0]);
//CCarryConvert.WriteDarkCasket("SimensCP5611.CSimensCP5611", "d_field_read", dbNo.ToString() + ":" + nr.ToString(), value_byte);
}
if (res != 0)
{
ErrMpi();
return null;
}
else
{
value_byte[0] =CCarryConvert.GetBitFromInteger( value_byte[0],Bit);
return value_byte;
}
}
catch (Exception ex)
{
Errors = ex.Message;
return null;
}
}
/// <summary>
/// 输出Mpi通讯错误信息
/// </summary>
static void ErrMpi()
{
try
{
Errors = CReadTextConfig.GetMPIErrors(res);
//int aa = error_message(0, "Error.eng");
//Errors = " ";
//aa = error_message(Convert.ToInt32(res), Errors);
}
catch (Exception ex)
{
Errors = ex.Message;
}
}
}
}