PLC and NFC Application
PLC and NFC Application
This PLC application about how to send UID NFC to the Mitsubishi PLC FX memory.
In this application using Mitsubishi PLC FX1S, ACR122U USB NFC Tag Reader & Writer,
Arduino UNO, and Arduino USB Host Shield.
enum
{
FX1SPACKET1,
FX1STOTAL_NO_OF_PACKETS
};
FX1SPacket FX1Spackets[FX1STOTAL_NO_OF_PACKETS];
FX1SpacketPointer FX1Spacket1 = &FX1Spackets[FX1SPACKET1];
#define NFC_Hardware "ACR122U"
#define NFC_Tags_Max 7
unsigned int NFC_FX1SwriteD[NFC_Tags_Max+1];
USB Usb;
USB_DEVICE_DESCRIPTOR buf;
uint8_t NFC_USB_Address;
uint8_t NFC_Code_Return;
uint8_t NFC_USB_State;
bool NFC_USB_RUN = false;
uint8_t NFC_Receive[64];
String NFC_Receive_String = "";
unsigned long NFC_Get_UID_Timeout;
uint16_t NFC_Receive_Total_Data;
uint16_t NFC_Receive_Size;
uint16_t NFC_Tags_Size;
uint8_t NFC_Tags[NFC_Tags_Max];
unsigned int NFC_Send_Success;
uint8_t
uint8_t
uint8_t
uint8_t
NFC_USB_Order;
NFC_EPP_OUT = 0x22; //NFC Endpoint Address Out Transfer : 0x02
NFC_EPP_IN1 = 0x01; //NFC Endpoint Address In Transfer 1: 0x81
NFC_EPP_IN2 = 0x02; //NFC Endpoint Address In Transfer 2: 0x82
uint8_t NFC_Easy_Connect_Code[15] =
{0x6B,0x05,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xFF,0x00,0x48,0x00,0x00};
uint8_t NFC_Reader_Code[10] =
{0x62,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00};
uint8_t NFC_Get_UID_Code[15] =
{0x6F,0x05,0x00,0x00,0x00,0x00,0x03,0x04,0x00,0x00,0xFF,0xCA,0x00,0x00,0x00};
void setup() {
if (Usb.Init() == -1){
//Near Field Communication (NFC) USB Reader did not start
while(1);
}
FX1S_construct(FX1Spacket1, FX1S_WRITE_D, 0, NFC_Tags_Max+1,
NFC_FX1SwriteD);
NFC_USB_State=3;
}else{
if(NFC_Receive_Size==2){
if(NFC_Receive[0]==0x50 && NFC_Receive[1]==0x03 ){
NFC_Get_UID_Timeout = millis() + 100;
NFC_USB_State=4;
}
}
}
break;
case 4: // ACR122U NFC Get Data UID
NFC_USB_Order++;
NFC_Tags_Size=0;
NFC_Code_Return =
ACR122U_USB_NFC_Tag_Reader(&NFC_Tags_Size, NFC_Tags);
if(NFC_Code_Return){
if(millis() > NFC_Get_UID_Timeout)NFC_USB_State=3;
}else{
if(NFC_Tags_Size>0){
memset(NFC_FX1SwriteD,0,sizeof(NFC_FX1SwriteD));
NFC_FX1SwriteD[0]=NFC_Tags_Size;
for(uint16_t i=0; i < NFC_Tags_Size; i++ ) {
NFC_FX1SwriteD[i+1]= NFC_Tags[i];
}
NFC_Send_Success = FX1Spacket1>FX1Ssuccessful_requests;
NFC_Get_UID_Timeout = millis() + 1000;
NFC_USB_State=5;
}else{
if(millis() > NFC_Get_UID_Timeout)NFC_USB_State=3;
}
}
break;
case 5: // NFC UID Send to Mitsubishi PLC FX
FX1S_update();
if(NFC_Send_Success != FX1Spacket1>FX1Ssuccessful_requests)NFC_USB_State=3;
if(millis() > NFC_Get_UID_Timeout)NFC_USB_State=3;
break;
}
}else{
if(NFC_USB_RUN){
// ACR122U NFC USB Not RUN
asm volatile (" jmp 0");
}
}
}
uint8_t ACR122U_Open_NFC() {
uint8_t Rcode;
NFC_Easy_Connect_Code[6]=NFC_USB_Order;
Rcode =
ACR122U_USB_NFC_Write(NFC_EPP_OUT,sizeof(NFC_Easy_Connect_Code),NFC_Easy_Conn
ect_Code);
if(Rcode)
return Rcode;
NFC_Receive_Total_Data=0;
NFC_Receive[0]=0;
NFC_Receive[1]=0;
Rcode = ACR122U_USB_NFC_Read(NFC_EPP_IN2,&NFC_Receive_Total_Data,
NFC_Receive, 10);
if(Rcode)
return Rcode;
if(NFC_Receive_Total_Data<12)
return (1);
if(NFC_Receive[0]!=0x83 || NFC_Receive[1]!=0x0A)
return (1);
NFC_Receive_String="";
for(uint16_t i=7; i < NFC_Receive_Total_Data; i++ )
NFC_Receive_String += String(char(NFC_Receive[i]));
if (NFC_Receive_String.indexOf(NFC_Hardware)!=-1)
return (0);
return (1);
}
uint8_t ACR122U_USB_NFC_Reader() {
uint8_t Rcode;
NFC_Reader_Code[6]=NFC_USB_Order;
Rcode =
ACR122U_USB_NFC_Write(NFC_EPP_OUT,sizeof(NFC_Reader_Code),NFC_Reader_Code);
if(Rcode)
return Rcode;
NFC_Receive_Total_Data=0;
NFC_Receive[0]=0;
Rcode = ACR122U_USB_NFC_Read(NFC_EPP_IN2,&NFC_Receive_Total_Data,
NFC_Receive, 10);
if(Rcode)
return Rcode;
if(NFC_Receive_Total_Data<12)
return (1);
if(NFC_Receive[0]==0x80)
return (0);
return (1);
}
*NFC_Key++ = NFC_Receive[i];
Buffer_NFC_Key_Size++;
}
*NFC_Key_Size = Buffer_NFC_Key_Size;
return (0);
return (1);
}