SCLS/SSWCS_JXDL(2019)/SimensProdave6/CSimensProdave6_S7.cs
2025-05-19 09:45:29 +08:00

382 lines
14 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using Microsoft.VisualBasic;
using CommonClassLib;
using DBFactory;
namespace SimensProdave6
{
public static class CSimensProdave6_S7
{
public static DBOperator dbo = new DBOperator();
static int res;
static bool _IfInit = false;
static int _InitCount = 0;
public static int InitCount
{
get { return CSimensProdave6_S7._InitCount; }
set { CSimensProdave6_S7._InitCount = value; }
}
static uint BufLen = 1024;
static string Errors;
/// <summary>
/// 与mpi网络通讯的故障信息
/// </summary>
public static string ErrorsText
{
get { return Errors; }
set { Errors = value; }
}
public struct CON_ADR_TYPE
{
//' MPI Stationsadresse (2 |0 |0 |0 |0 |0 )
//' IP Adresse (192|168|0 |1 |0 |0 )
//' MAC Adresse (08 |00 |06 |01 |AA |BB )
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public byte[] PlcAddress;
//char[]
//[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
//public string name;
}
public struct CON_TABLE_TYPE
{
/// <summary>
/// MPI Stationsaddress (2 |0 |0 |0 |0 |0 )
/// IP Address (192|168|0 |1 |0 |0 )
/// MAC Address (08 |00 |06 |01 |AA |BB )
/// </summary>
public CON_ADR_TYPE Adr ; // Verbindungsadresse
/// <summary>
/// Typ der Adresse MPI(1) IP(2) MAC(3)
/// </summary>
public byte AdrType; // Typ der Adresse MPI(1) IP(2) MAC(3)
public byte SlotNr; // Slot-Nummer
public byte RackNr; // Rack-Nummer
}
//[DllImport("Prodave6.dll")]
//static extern int LoadConnection_ex6(Int16 ConNr,string AccessPoint , Int16 ConTableLen, CON_TABLE_TYPE pConTable);
//[DllImport("Prodave6.dll", EntryPoint = "LoadConnection_ex6", ExactSpelling = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
//static extern ushort LoadConnection_ex6(ushort ConNr, char[] pAccessPoint, int ConTableLen, byte[] ConTable);
//[DllImport("Prodave6.dll")]
//static extern ushort SetActiveConnection_ex6(int ConNr);
//[DllImport("Prodave6.dll")]
//static extern ushort db_read_ex6(ushort blknr, string DatType, ushort StartNr, int Amount, int BufLen, ref byte pBuchBuffer, int pDatLen);
//[DllImport("Prodave6.dll")]
//static extern ushort db_write_ex6(ushort blknr, string DatType, ushort StartNr, int Amount,ref int BufLen, ref byte pWriteBuffer);
//[DllImport("Prodave6.dll")]
//static extern ushort field_read_ex6(byte FieldType, ushort blknr, ushort StartNr, int Amount, int BufLen, ref byte pBuchBuffer, int pDatLen);
//[DllImport("Prodave6.dll")]
//static extern ushort field_write_ex6(byte FieldType, ushort blknr, ushort StartNr, int Amount, int BufLen, ref byte pWriteBuffer);
[DllImport("Prodave6.dll", EntryPoint = "LoadConnection_ex6", ExactSpelling = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
private static extern int LoadConnection_ex6(ushort ConNr, char[] pAccessPoint, int ConTableLen, byte[] ConTable);
[DllImport("Prodave6.dll", EntryPoint = "UnloadConnection_ex6", ExactSpelling = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int UnloadConnection_ex6(ushort ConNr);
[DllImport("Prodave6.dll", EntryPoint = "SetActiveConnection_ex6", ExactSpelling = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
private static extern int SetActiveConnection_ex6(ushort ConNr);
[DllImport("Prodave6.dll", EntryPoint = "db_read_ex6", ExactSpelling = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
private static extern int db_read_ex6(ushort no_of_db, byte datatype, ushort startaddr, ref uint read_request_length, uint bufferlength, byte[] buffer, ref uint returnlength);
[DllImport("Prodave6.dll", EntryPoint = "db_write_ex6", ExactSpelling = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
private static extern int db_write_ex6(ushort no_of_db, byte datatype, ushort startaddr, ref uint write_request_length, uint bufferlength, byte[] buffer);
[DllImport("Prodave6.dll")]
static extern ushort GetErrorMessage_ex6(ushort ErrorNr, ushort BufLen,ref byte pBuffer);
/// <summary>
/// 初始化PLC网络
/// </summary>
/// <returns></returns>
public static bool InitNetwork()
{
char[] pAccessPoint ={ 'S', '7', 'O', 'N', 'L', 'I', 'N', 'E' };
byte[] conn = new byte[] { 172, 18, 132, 11, 0, 0, 2, 0, 0 };
int length = (int)conn.Length;
if (_InitCount > 3)
{
Errors = "Prodave已经三次初始化网络失败网络通讯失败请退出系统检查网络";
return false;
}
int res = LoadConnection_ex6((ushort)0, pAccessPoint, length, conn);
if (res == 0)
{
_IfInit = true;
return true;
}
else
{
GetErrorText((ushort)res);
_IfInit = false;
_InitCount++;
return false;
}
}
static void GetErrorText(int ret)
{
byte[] errorBuffer=new byte[256];
ret = GetErrorMessage_ex6((ushort)ret, 256, ref errorBuffer[0]);
Errors= Encoding.ASCII.GetString(errorBuffer);
_IfInit = false;
UnloadConnection_ex6(0);
}
/// <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 DB_Write_Prodave(byte connNo, ushort dbNo, ushort nr, uint AMOUNT, byte[] value)
{
byte DatType = 2;//byte DatType = 2;WORD DatType = 4;DWORD DatType = 6
try
{
if (_IfInit != true)
{
if (InitNetwork() == false)
{
return false;
}
}
res = SetActiveConnection_ex6(connNo);
if (res == 0)
{
res = db_write_ex6(dbNo,DatType, nr,ref AMOUNT, BufLen,value);
}
if (res != 0)
{
GetErrorText(res);
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>
/// <returns>所有字节型数组</returns>
public static byte[] DB_Read_Prodave(byte connNo, ushort dbNo, ushort nr, uint AMOUNT)
{
byte[] value_byte=new byte[1024];
uint pDatLen=0;
byte DatType = 2;//byte DatType = 2;WORD DatType = 4;DWORD DatType = 6
try
{
if (_IfInit != true)
{
if (InitNetwork() == false)
{
return null;
}
}
res = SetActiveConnection_ex6(0);
if (res == 0)
{
res = db_read_ex6(dbNo, DatType, nr, ref AMOUNT, BufLen, value_byte,ref pDatLen);
}
if (res != 0)
{
GetErrorText(res);
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_Prodave(byte connNo, ushort dbNo, ushort nr, uint AMOUNT, int Bit)
{
byte[] value_byte = new byte[1024];
uint pDatLen = 0;
byte DatType = 2;//byte DatType = 2;WORD DatType = 4;DWORD DatType = 6
try
{
if (_IfInit != true)
{
if (InitNetwork() == false)
{
return null;
}
}
res = SetActiveConnection_ex6(connNo);
if (res == 0)
{
res = db_read_ex6(dbNo, DatType, nr,ref AMOUNT, BufLen, value_byte,ref pDatLen);
}
if (res != 0)
{
GetErrorText(res);
return null;
}
else
{
value_byte[0] = CCarryConvert.GetBitFromInteger(value_byte[0], Bit);
return value_byte;
}
}
catch (Exception ex)
{
Errors = ex.Message;
return null;
}
}
/// <summary>
/// //'向指定连接connNo的DataTypeIdx数据存储区写入数据
/// </summary>
/// <param name="connNo">连接编号</param>
/// <param name="DataTypeIdx">数据存储区的类型 "Ausgangsbyte",FieldType = Asc("a");
///"Datenbyte",FieldType = Asc("d");
///"Eingangsbyte",FieldType = Asc("e");
///"Merkerbyte",FieldType = Asc("m");
///"Timerwort",FieldType = Asc("t");
///"Z鋒lerwort",FieldType = Asc("z")</param>
/// <param name="addrno">开始地址</param>
/// <param name="AMOUNT">写入的个数</param>
/// <param name="value_byte">写入的字节型数组数据</param>
/// <returns></returns>
///
//public static bool write_Prodave(byte connNo, byte DataTypeIdx, ushort addrno, int AMOUNT, byte[] value_byte)
//{
// try
// {
// if (IfInit != true)
// {
// if (InitNetwork() == false)
// {
// return false;
// }
// }
// res = SetActiveConnection_ex6(connNo);
// if (res == 0)
// {
// field_write_ex6(DataTypeIdx, 0, addrno, AMOUNT, BufLen, ref value_byte[0]);
// }
// if (res != 0)
// {
// GetErrorText(res);
// return false;
// }
// return true;
// }
// catch (Exception ex)
// {
// Errors = ex.Message;
// return false;
// }
//}
///// <summary>
///// //'读出MPI通讯缓冲区的数据
///// </summary>
///// <param name="connNo">连接编号</param>
///// <param name="DataTypeIdx">数据存储区的类型 "Ausgangsbyte",FieldType = Asc("a");
/////"Datenbyte",FieldType = Asc("d");
/////"Eingangsbyte",FieldType = Asc("e");
/////"Merkerbyte",FieldType = Asc("m");
/////"Timerwort",FieldType = Asc("t");
/////"Z鋒lerwort",FieldType = Asc("z")</param>
///// <param name="addrNo">开始读数据的地址</param>
///// <param name="AMOUNT">读取数量</param>
///// <returns>所有字节型数组</returns>
//public static byte[] read_Prodave(byte connNo, byte DataTypeIdx, ushort addrNo, int AMOUNT)
//{
// byte[] value_byte = new byte[1024];
// ushort pDatLen = 0;
// try
// {
// if (IfInit != true)
// {
// if (InitNetwork() == false)
// {
// return null;
// }
// }
// if (AMOUNT > 512)
// AMOUNT = 512;
// res = SetActiveConnection_ex6(connNo);
// if (res == 0)
// {
// res = field_read_ex6(DataTypeIdx, 0, addrNo, AMOUNT, BufLen, ref value_byte[0], pDatLen);
// }
// if (res != 0)
// {
// GetErrorText(res);
// return null;
// }
// else
// {
// return value_byte;
// }
// }
// catch (Exception ex)
// {
// Errors = ex.Message;
// return null;
// }
//}
}
}