关于C#如何使用Prodave(实战DllImport)
2009-06-16 08:33:22 来源:WEB开发网(5)以下是测试的代码:
//以下测试LoadConnection_ex6
short ConNr= 63; // First connection;(0 ... 63);(max. 64 connections).
string AccessPoint = "S7ONLINE"; // Default access point——S7ONLINE
Prodave6_CS.Prodave6.CON_TABLE_TYPE ConTable ;// Connection table
int ConTableLen = System.Runtime.InteropServices.Marshal.SizeOf(typeof(Prodave6_CS.Prodave6.CON_TABLE_TYPE)) ;// Length of the connection table
int RetValue;
ConTable.Adr=new byte[]{192,168,1,200,0,0};
ConTable.AdrType = 2; // Type of address: MPI/PB (1), IP (2), MAC (3)
ConTable.SlotNr = 2; // 插槽号
ConTable.RackNr = 0; // 机架号
RetValue = Prodave6.LoadConnection_ex6(ConNr, AccessPoint, ConTableLen,ref ConTable);
//以下测试SetActiveConnection_ex6
UInt16 UConNr = (UInt16)ConNr;
RetValue = Prodave6.SetActiveConnection_ex6(UConNr);
//以下测试db_write_ex6
UInt16 BlkNr = 4;//data block号
Prodave6.DatType DType = Prodave6.DatType.BYTE;//要读取的数据类型
UInt16 StartNr = 0;//起始地址号
UInt32 pAmount = 20;//需要读取类型的数量
UInt32 BufLen = 20;//缓冲区长度(字节为单位)
//参数:data block号、要写入的数据类型、起始地址号、需要写入类型的数量、缓冲区长度(字节为单位)、缓冲区
byte[] pWriteBuffer = new byte[20];
for (int i = 0; i < pWriteBuffer.Length; i++)
pWriteBuffer[i] = (byte)(i+1);
RetValue = Prodave6.db_write_ex6(BlkNr, DType, StartNr, ref pAmount, BufLen, pWriteBuffer);
//以下测试db_read_ex6
//参数:data block号、要读取的数据类型、起始地址号、需要读取类型的数量、缓冲区长度(字节为单位)、
//缓冲区、缓冲区数据交互的长度
byte[] pReadBuffer = new byte[20];
UInt32 pDatLen = 0;
RetValue = Prodave6.db_read_ex6(BlkNr, DType, StartNr, ref pAmount, BufLen, pReadBuffer, ref pDatLen);
//以下测试field_read_ex6(测试DB区)
//参数:data block号、要读取的数据类型、起始地址号、需要读取类型的数量、缓冲区长度(字节为单位)、
//缓冲区、缓冲区数据交互的长度
Prodave6.FieldType FType = Prodave6.FieldType.D;
for (int i = 0; i < pWriteBuffer.Length; i++)
pWriteBuffer[i] = (byte)(i);
RetValue = Prodave6.field_write_ex6(FType, BlkNr, StartNr, pAmount, BufLen, pWriteBuffer);
//以下测试field_read_ex6(测试DB区)
//参数:data block号、要读取的数据类型、起始地址号、需要读取类型的数量、缓冲区长度(字节为单位)、
//缓冲区、缓冲区数据交互的长度
byte[] pReadBuffer2 = new byte[20];
RetValue = Prodave6.field_read_ex6(FType, BlkNr, StartNr, pAmount, BufLen,pReadBuffer2, ref pDatLen);
//以下测试field_read_ex6(测试M区)
//参数:data block号、要读取的数据类型、起始地址号、需要读取类型的数量、缓冲区长度(字节为单位)、
//缓冲区、缓冲区数据交互的长度
Prodave6.FieldType FTypeM = Prodave6.FieldType.M;
byte []pWriteBufferM = {2};
RetValue = Prodave6.field_write_ex6(FTypeM, 0, 100, 1, 1, pWriteBufferM);
//以下测试field_read_ex6(测试M区)
//参数:data block号、要读取的数据类型、起始地址号、需要读取类型的数量、缓冲区长度(字节为单位)、
//缓冲区、缓冲区数据交互的长度
byte[] pReadBufferM2 = new byte[1];
RetValue = Prodave6.field_read_ex6(FTypeM, 0, 100, 1, 1, pReadBufferM2, ref pDatLen);
//以下测试mb_setbit_ex6
UInt16 MbNr = 100;//mb block号
UInt16 BitNr = 0;//位号
byte Value = 1;//0、1
RetValue = Prodave6.mb_setbit_ex6(MbNr,BitNr, Value);
//以下测试mb_bittset_ex6(测试DB区)
int pValue = 0;
RetValue = Prodave6.mb_bittest_ex6(MbNr, BitNr, ref pValue);
//以下测试GetLoadedConnections_ex6
BufLen = 64;
int[] pBufferI = new int[64];
Prodave6.GetLoadedConnections_ex6(BufLen, pBufferI);
//以下测试UnloadConnection_ex6
RetValue = Prodave6.UnloadConnection_ex6(UConNr);
//以下测试GetErrorMessage_ex6
int ErrorNr = 0x7040; // Block boundary exceeded, correct the number
StringBuilder Buffer = new StringBuilder(300); // Transfer buffer for error text
BufLen = (UInt32)Buffer.Capacity; // Buffer length
RetValue = Prodave6.GetErrorMessage_ex6(ErrorNr, BufLen, Buffer);
//以下测试float_2_gp_ex6
float ieee = 1.2F;
UInt32 gp=0;
float pieee=0;
RetValue = Prodave6.float_2_gp_ex6(ieee, ref gp);
RetValue = Prodave6.gp_2_float_ex6(gp,ref pieee);
//以下测试gp_2_float_ex6
RetValue = Prodave6.testbit_ex6(7, 0);
RetValue = Prodave6.testbit_ex6(7, 1);
RetValue = Prodave6.testbit_ex6(7, 2);
RetValue = Prodave6.testbit_ex6(7, 3);
RetValue = Prodave6.testbit_ex6(7, 4);
RetValue = Prodave6.testbit_ex6(7, 5);
RetValue = Prodave6.testbit_ex6(7, 6);
RetValue = Prodave6.testbit_ex6(7, 7);
//以下测试byte_2_bool_ex6
int [] boolValue=new int[8];
Prodave6.byte_2_bool_ex6(255, boolValue);
//以下测试bool_2_byte_ex6
byte byteValue;
byteValue=Prodave6.bool_2_byte_ex6(boolValue);
//以下测试kf_2_integer_ex6和kf_2_long_ex6
UInt16 u16=25600;UInt16 u16_;
u16_=Prodave6.kf_2_integer_ex6(u16);
UInt32 u32 = 1677721600; UInt32 u32_;
u32_=Prodave6.kf_2_long_ex6(u32);
//以下测试swab_buffer_ex6(byte[] pBuffer, UInt32 Amount)
byte[] pBuffer=new byte[11];
UInt32 Amount=(UInt32)pBuffer.Length;
for (int i = 0; i < Amount; i++)
pBuffer[i] = (byte)(i+1);
Prodave6.swab_buffer_ex6(pBuffer, 6);
//以下测试copy_buffer_ex6
byte[] pSourceBuffer={1,2,3,4,5,6,7,8,9,10};
byte[] pTargetBuffer=new byte[10];
Prodave6.copy_buffer_ex6( pTargetBuffer, pSourceBuffer,8);
//以下测试ushort_2_bcd_ex6
UInt16[] pwValues = { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 };
Prodave6.ushort_2_bcd_ex6(pwValues, 10, 0, 0);
//以下测试bcd_2_ushort_ex6
Prodave6.bcd_2_ushort_ex6(pwValues, 10, 0, 0);
UInt32[] pdwValues = { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 };
//以下测试ulong_2_bcd_ex6
Prodave6.ulong_2_bcd_ex6(pdwValues,8, 0, 0);
//以下测试bcd_2_ulong_ex6
Prodave6.bcd_2_ulong_ex6(pdwValues, 8, 0, 0);
(6)最后,要说的是我没有转换全部的函数,只是挑了我认为比较常用的,或者我可能用的到的进行了转换。
详细的程序包,如果能要的话,可以去这里下载,同时还附带了英文版的prodave的pdf说明书哦:
http://download.csdn.net/source/1408924
如果只是要单独下载电子书的话,请看这里:
http://download.csdn.net/source/1408940
注意:开发环境为VS2008SP1,而其是控制台程序,没有输出,想看时如何测试各个函数的,请自行断点跟踪,程序是我测试过的,不存在错误,除非您该我代码。当然,您得在PLC的地址中开放必要的地址以供测试。
更多精彩
赞助商链接