industrialNETworXnetx

DrunkenHero

DrunkenHero

| 20.10.2009 | 13:04 | 12 replies

Sending Packets with xChannelPutPacket

Hi,

I try to send a packet with xChannelPutPacket, but I always get an error message.

int _tmain(int argc, _TCHAR* argv[])
{
	HANDLE hDriver = NULL;
	HANDLE hSys = NULL;
	long lRet =CIFX_NO_ERROR;
	unsigned long       ulState        = 0;
	#define HOSTSTATE_TIMEOUT   5000
//Treiber öffnen----------------------------------------------------
	lRet = xDriverOpen(&hDriver);

if(CIFX_NO_ERROR != lRet)
{
printf("Error opening driver. lRet=0x%08X\r\n", lRet);
}
//Channel öffen-----------------------------------------------------
else{
HANDLE hChannel = NULL;
lRet = xChannelOpen(hDriver, "cifX0", 0, &hChannel);
if(CIFX_NO_ERROR != lRet)
{
printf("Error opening Channel!");
}
else{
APIOC_DCP_IDENT_ALL_REQ_T send_Identall;
send_Identall.tHead.ulDest=0;
send_Identall.tHead.ulSrc=0;
send_Identall.tHead.ulDestId=0;
send_Identall.tHead.ulSrcId=4;
send_Identall.tHead.ulLen=0;
send_Identall.tHead.ulId=0;
//send_Identall.tHead.ulSta;
send_Identall.tHead.ulCmd=0xc10;
send_Identall.tHead.ulExt=0;
send_Identall.tHead.ulRout=0;

send_Identall.tData.ulTimeout=10;

xChannelPutPacket(hChannel,&send_Identall,PACKET_WAIT_TIMEOUT);
.
.
.

Error Message:error C2664: 'xChannelPutPacket': Konvertierung des Parameters 2 von 'APIOC_DCP_IDENT_ALL_REQ_T *__w64 ' in 'CIFX_PACKET *' nicht möglich

Andreas Jacob

Andreas Jacob

Hilscher Gesellschaft fuer Systemautomation mbH

| 20.10.2009 | 14:37

Hi,

the 2nd parameter have to be a pointer to the package which you want to sent.

				PACKET_SET_IDENT_ALL_REQ_T tsend_Identall = {{0}};		
				CIFX_PACKET                       tRecvPkt 			= {{0}};

send_Identall.tHead.ulDest=0;
send_Identall.tHead.ulSrc=0;
send_Identall.tHead.ulDestId=0;
send_Identall.tHead.ulSrcId=4;
send_Identall.tHead.ulLen=0;
send_Identall.tHead.ulId=0;
//send_Identall.tHead.ulSta;
send_Identall.tHead.ulCmd=0xc10;
send_Identall.tHead.ulExt=0;
send_Identall.tHead.ulRout=0;

send_Identall.tData.ulTimeout=10;

xChannelPutPacket(hChannel, (CIFX_PACKET *) &tsend_Identall, ulTimeout);

M T

M T

Hilscher Gesellschaft für Systemautomation mbH

| 20.10.2009 | 16:59

DrunkenHero wrote:
Error Message:error C2664: 'xChannelPutPacket': Konvertierung des Parameters 2 von 'APIOC_DCP_IDENT_ALL_REQ_T *__w64 ' in 'CIFX_PACKET *' nicht möglich

Are you compiling for 64 Bit?
If so, this will not work, even with a cast, as driver and API will only process 32Bit Pointers correctly.

If your application is 32Bit you can cast to pointer to "CIFX_PACKET*"

Regards

MT

DrunkenHero

DrunkenHero

| 20.10.2009 | 17:22

Thanks for the help.
But know I have another problem. When I receive the answer of the Ident All Requ, I want to to dump the data:

	APIOC_DCP_IDENT_ALL_REQ_T send_Identall;
			send_Identall.tHead.ulDest=0;
			send_Identall.tHead.ulSrc=0;
			send_Identall.tHead.ulDestId=0;
			send_Identall.tHead.ulSrcId=4;
			send_Identall.tHead.ulLen=0;
			send_Identall.tHead.ulId=0;
			send_Identall.tHead.ulSta=0;
			send_Identall.tHead.ulCmd=0xc10;
			send_Identall.tHead.ulExt=0;
			send_Identall.tHead.ulRout=0;

send_Identall.tData.ulTimeout=10;

APIOC_DCP_IDENT_ENTRY_PCK_T receive_Identall={{0}};


if(CIFX_NO_ERROR != (xChannelPutPacket(hChannel,(CIFX_PACKET *)&send_Identall,PACKET_WAIT_TIMEOUT)))
xChannelGetPacket(hChannel, sizeof(receive_Identall), (CIFX_PACKET *)&receive_Identall, PACKET_WAIT_TIMEOUT);
printf("Send IdentAll Packet: \r\n");
DumpPacket((CIFX_PACKET *)&send_Identall);
printf("Received IdentAll Packet: \r\n");
DumpPacket((CIFX_PACKET *)&receive_Identall);

printf("IP Adresse: %u \r\n",receive_Identall.tInd.tData.ulIp);
printf("Netzmaske: %u \r\n",receive_Identall.tInd.tData.ulNetMask);
printf("Gateway: %u \r\n",receive_Identall.tInd.tData.ulGateway);
printf("Vendor ID: %u \r\n",receive_Identall.tInd.tData.usVendorId);

But the the outpit is as following:
IP Adresse: 0
Netzmaske: 0
Gateway: 0
Vendor ID: 0
(The DumpPacket function is from the CIFX_Demo appl)

Benjamin Meyer

Benjamin Meyer

Hilscher Gesellschaft fuer Systemautomation mbH

| 20.10.2009 | 20:36

your problem is that you send the IdentAll-Request and directly convert the next packet which is in the mailbox into an Ident_Entry_Indication.

Please check the packet header's ulCmd to find out which kind of packet you just took from the mailbox.
It is also a very good idea to check the packet header's ulState as well. if it is not 0 it contains an errorcode and your request failed (e.g. because of Bus OFF)

DrunkenHero

DrunkenHero

| 21.10.2009 | 14:42

Hi

in the receive_Identall Packet:
ulCmd : 0x00002f01
ulSate : 0x00000000

1.Question:
how can I realize to get the packet I want to.
In this case I want to receive a packet with the IP,Gateway,..and so on of the Slave I have connected to the CIFX 50 RE.
2.Question:
Is it possible to wait for a specific packet.
Is it possible to notice when a packet arrives, for example with a Interrupt or something like that.

Benjamin Meyer

Benjamin Meyer

Hilscher Gesellschaft fuer Systemautomation mbH

| 21.10.2009 | 14:49

i forgot one important thing: if you want to use the IdentifyAll service, you have to register your application to the stack.
otherwise the stack does not know where to send the IdentEntry-Indications to.

Please have a look in netX Dual-Port Memory Interface Manual and look for "Register application".

DrunkenHero

DrunkenHero

| 21.10.2009 | 17:57

Hi bm,

thanks for the help, but I still got no success :cry: !

//Treiber öffnen----------------------------------------------------
	lRet = xDriverOpen(&hDriver);

if(CIFX_NO_ERROR != lRet)
{
printf("Error opening driver. lRet=0x%08X\r\n", lRet);
}
//Channel öffen-----------------------------------------------------
else{
HANDLE hChannel = NULL;
lRet = xChannelOpen(hDriver, "cifX0", 0, &hChannel);
if(CIFX_NO_ERROR != lRet)
{
printf("Error opening Channel!");
}
else{
//register the appl at the stack------------------------------------
RCX_REGISTER_APP_CNF_T register_appl;
register_appl.tHead.ulDest=0x00000020;
register_appl.tHead.ulSrc=0;
register_appl.tHead.ulDestId=0;
register_appl.tHead.ulSrcId=0;
register_appl.tHead.ulLen=0;
register_appl.tHead.ulId=0;
register_appl.tHead.ulSta=0;
register_appl.tHead.ulCmd=0x00002f10;
register_appl.tHead.ulExt=0;
register_appl.tHead.ulRout=0;

RCX_REGISTER_APP_CNF_T register_appl_answer={0};
//xChannelPutPacket(hChannel,(CIFX_PACKET *)®ister_appl,PACKET_WAIT_TIMEOUT);
DumpPacket((CIFX_PACKET *)®ister_appl);
if(CIFX_NO_ERROR==(lRet=xSysdeviceOpen(hDriver,"cifX0",&hSys)))
xSysdevicePutPacket(&hSys,(CIFX_PACKET*)®ister_appl,PACKET_WAIT_TIMEOUT);
Sleep(1000);
xSysdeviceGetPacket(&hSys,sizeof(register_appl_answer),(CIFX_PACKET*)®ister_appl_answer,PACKET_WAIT_TIMEOUT);;
DumpPacket((CIFX_PACKET *)®ister_appl_answer);
//send a Ident All Request-------------------------------------
APIOC_DCP_IDENT_ALL_REQ_T send_Identall;
send_Identall.tHead.ulDest=0;
send_Identall.tHead.ulSrc=0;
send_Identall.tHead.ulDestId=0;
send_Identall.tHead.ulSrcId=4;
send_Identall.tHead.ulLen=0;
send_Identall.tHead.ulId=0;
send_Identall.tHead.ulSta=0;
send_Identall.tHead.ulCmd=0xc10;
send_Identall.tHead.ulExt=0;
send_Identall.tHead.ulRout=0;

send_Identall.tData.ulTimeout=10;

APIOC_DCP_IDENT_ENTRY_PCK_T receive_Identall={{0}};




if(CIFX_NO_ERROR == (lRet=xChannelPutPacket(hChannel,(CIFX_PACKET *)&send_Identall,PACKET_WAIT_TIMEOUT))){
Sleep(500);
printf("if_schleife\r\n");
xChannelGetPacket(hChannel, sizeof(receive_Identall), (CIFX_PACKET *)&receive_Identall, PACKET_WAIT_TIMEOUT);
}

printf("Send IdentAll Packet: \r\n");
DumpPacket((CIFX_PACKET *)&send_Identall);
printf("Received IdentAll Packet: \r\n");
DumpPacket((CIFX_PACKET *)&receive_Identall);


printf("IP Adresse: 0x%08X \r\n",receive_Identall.tInd.tData.ulIp);
printf("Netzmaske: 0x%08X \r\n",receive_Identall.tInd.tData.ulNetMask);
printf("Gateway: 0x%08X \r\n",receive_Identall.tInd.tData.ulGateway);
printf("Vendor ID: %u \r\n",receive_Identall.tInd.tData.usVendorId);
printf("ulCmd: 0x%08X \r\n",receive_Identall.tInd.tHead.ulCmd);
printf("ulState 0x%08X \r\n",receive_Identall.tInd.tHead.ulSta);

I am an absolut beginner in programming the CIFX Card, so could you please tell wether I have to use the XChannelPutPacket or the xSysdevicePutPacket command to register the appl at the stack.

Benjamin Meyer

Benjamin Meyer

Hilscher Gesellschaft fuer Systemautomation mbH

| 21.10.2009 | 18:49

try something like this. i would use xChannelPutPacket()

//Treiber öffnen----------------------------------------------------
	lRet = xDriverOpen(&hDriver);

if(CIFX_NO_ERROR != lRet)
{
printf("Error opening driver. lRet=0x%08X\r\n", lRet);
}
//Channel öffen-----------------------------------------------------
else{
HANDLE hChannel = NULL;
lRet = xChannelOpen(hDriver, "cifX0", 0, &hChannel);
if(CIFX_NO_ERROR != lRet)
{
printf("Error opening Channel!");
}
else{
//register the appl at the stack------------------------------------
RCX_REGISTER_APP_REQ_T register_appl;
register_appl.tHead.ulDest=0x00000020;
register_appl.tHead.ulSrc=0;
register_appl.tHead.ulDestId=0;
register_appl.tHead.ulSrcId=0;
register_appl.tHead.ulLen=0;
register_appl.tHead.ulId=0;
register_appl.tHead.ulSta=0;
register_appl.tHead.ulCmd=0x00002f10;
register_appl.tHead.ulExt=0;
register_appl.tHead.ulRout=0;

RCX_REGISTER_APP_CNF_T register_appl_answer={0};
xChannelPutPacket(hChannel,(CIFX_PACKET *)®ister_appl,PACKET_WAIT_TIMEOUT);
Sleep(1000);

xChannelGetPacket(hChannel, sizeof(receive_Identall), (CIFX_PACKET *)®ister_appl_answer, PACKET_WAIT_TIMEOUT);
// TODO: check return code and packet command

// if all okay -> send a Ident All Request-------------------------------------
APIOC_DCP_IDENT_ALL_REQ_T send_Identall;
APIOC_DCP_IDENT_ALL_CNF_T send_IdentallConfirmation;

send_Identall.tHead.ulDest=0x20; // ATTENTION HERE
send_Identall.tHead.ulSrc=0;
send_Identall.tHead.ulDestId=0;
send_Identall.tHead.ulSrcId=4;
send_Identall.tHead.ulLen=4; // ATTENTION HERE
send_Identall.tHead.ulId=0;
send_Identall.tHead.ulSta=0;
send_Identall.tHead.ulCmd=0xc10;
send_Identall.tHead.ulExt=0;
send_Identall.tHead.ulRout=0;

send_Identall.tData.ulTimeout=10;

xChannelPutPacket(hChannel,(CIFX_PACKET *)®ister_appl,PACKET_WAIT_TIMEOUT);
Sleep(1000);

xChannelGetPacket(hChannel, sizeof(receive_Identall), (CIFX_PACKET *)®ister_appl_answer, PACKET_WAIT_TIMEOUT);
// TODO: check return code and packet command

// TODO: if return code was okay IdentEntryInd may be received if IO-Device is connected to IO-Controller

DrunkenHero

DrunkenHero

| 23.10.2009 | 09:51

Hi,

after getting the packet:

if(CIFX_NO_ERROR==(lRet=xChannelPutPacket(hChannel,(CIFX_PACKET *)®ister_appl,PACKET_WAIT_TIMEOUT)))
			Sleep(1000);
			
			lRet=xChannelGetPacket(&hSys,sizeof(register_appl_answer),(CIFX_PACKET*)®ister_appl_answer,PACKET_WAIT_TIMEOUT);;
			
// TODO: check return code and packet command
			printf("register appl response:\r\n");
			if(lRet==CIFX_NO_ERROR)
				printf("packet command: %u",register_appl_answer.tHead.ulCmd);
			else{
				char szError[1024] ={0};
				xDriverGetErrorDescription(lRet,szError,sizeof(szError));
				printf("%s___0x%08X\n",szError,lRet);  //Show the error message
			}

I get "IO Control failed (0x800b0033) as error code

Andreas Jacob

Andreas Jacob

Hilscher Gesellschaft fuer Systemautomation mbH

| 23.10.2009 | 13:44

Hi,

are you sure, that you are using the right channel?

Quote:
lRet=xChannelGetPacket(&hSys,sizeof(register_appl_answer),(CIFX_PACKET*)®ister_appl_answer,PACKET_WAIT_TIMEOUT);;

I think you should use the same handle as no the "xChannelPutPacket" command which is "hChannel".

DrunkenHero

DrunkenHero

| 23.10.2009 | 14:12

Hi AJ,

i changed the channel hChannel.
But now I get the error Code:
"No Packet available"

Andreas Jacob

Andreas Jacob

Hilscher Gesellschaft fuer Systemautomation mbH

| 02.11.2009 | 10:15

Hi,

there is something wrong in your project. But unfortunately I did not see what is going wrong. I am concerned about the fact, that you did not receive any response on your RegisterApplication request.

Login