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
Hilscher Gesellschaft für Systemautomation mbH
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
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)
Hilscher Gesellschaft fuer Systemautomation mbH
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)
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.
Hilscher Gesellschaft fuer Systemautomation mbH
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".
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.
Hilscher Gesellschaft fuer Systemautomation mbH
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
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
}Hilscher Gesellschaft fuer Systemautomation mbH
Hi,
are you sure, that you are using the right channel?
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".
Hi AJ,
i changed the channel hChannel.
But now I get the error Code:
"No Packet available"
Hilscher Gesellschaft fuer Systemautomation mbH
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.
Andreas Jacob
Hilscher Gesellschaft fuer Systemautomation mbH
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);