using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; using Microsoft.VisualBasic; using CommonClassLib; namespace SimensCP5611 { /// /// Richard.liu 2008 /// 西门子PLC S7-300的MPI通讯的静态类,不需要构造和5611卡的初始化; /// 网络通讯产生的错误记录在ErrorsText属性中; /// 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; /// /// 与mpi网络通讯的故障信息 /// 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 ); /// /// 初始化CP5611卡 /// /// true初始化成功,false失败 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; } /// /// //'向指定连接connNo的DataTypeIdx数据存储区写入数据 /// /// 连接编号 /// 数据存储区的类型DataTypeIdx=2是Flag(M区) /// 开始地址 /// 写入的个数 /// 写入的字节型数组数据 /// /// 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; } } /// /// 向MPI通讯缓冲区DB区的写入数据 /// /// 连接编号 /// DB数据块编号 /// 写DB数据块的DW数据的开始地址 /// 写入数量 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; } } /// /// //'读出MPI通讯缓冲区的数据 /// /// 连接编号 /// 数据存储区的类型DataTypeIdx=2是Flag(M区) /// 开始读数据的地址 /// 读取数量 /// 所有字节型数组 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; } } /// /// //'读出MPI通讯缓冲区DB区的数据 /// /// 连接编号 /// DB数据块编号 /// 读DB数据块的DW数据的开始地址 /// 读取数量 /// 所有字节型数组 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; } } /// /// //'读出MPI通讯缓冲区DB区的数据 /// /// 连接编号 /// DB数据块编号 /// 读DB数据块的DW数据的开始地址 /// 读取数量 /// 比特(位数) /// 所有字节型数组 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; } } /// /// 输出Mpi通讯错误信息 /// 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; } } } }