WEB开发网
开发学院软件开发C语言 关于C#如何使用Prodave(实战DllImport) 阅读

关于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&

(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的地址中开放必要的地址以供测试。

上一页  1 2 3 4 

Tags:关于 如何 使用

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接