void CUldBtmConv::Cycle(void) { if(!m_fsm.IsInProgress(C_CONV_START, C_CONV_END)) return; switch(m_fsm.GetStatus()) { case C_CONV_START: if(m_fsm.DelaymS(15000)) { SetOut(oUldOutConvOn, FALSE); g_err.Save(ER_ULD_BTM_CONV_JAM); m_fsm.SetStatus(MC_STOP); break; } SetOut(oUldOutConvOn, TRUE); if(AOn(iUldOutMzArrival)) break; m_fsm.SetStatus(C_CONV_END); break; case C_CONV_END: if(!m_fsm.DelaymS(10000)) break; SetOut(oUldOutConvOn, FALSE); m_fsm.SetStatus(MC_STOP); break; } }//--------------------------------------------------------------
bool Write(int address, const void *data, int length, bool noinc){ if (State != FSTATE_Running) return false; bool result = SPI::Open(); if (result == true){ unsigned short header[2]; address &= 0x1FFF; if (noinc == false){ address |= 0x6000; }else{ address |= 0x4000; } header[0] = address; header[1] = length; SetOut(PIN_FPGA_nCS, OUT_LOW); Barrier(); SPI::SetMode(SPI::MODE_16BIT); SPI::SetupTxDMA(header, 2); SPI::SetupTxDMA(data, length); SPI::StartDMA(); SPI::WaitTxDMA(); SPI::StopDMA(); Barrier(); SetOut(PIN_FPGA_nCS, OUT_HIGH); SPI::Close(); } return result; }
// 書き込み bool Write(const void *data, unsigned int len, unsigned int &written){ // ポインタとサイズの確認 if (State != FSTATE_Config) return false; written = len; //xprintf("Conf:write(%d)\n", len); if (GetIn(PIN_FPGA_DONE) == IN_LOW){ // コンフィギュレーションはまだ終わってない // 送信 if (SPI::Open() == false) return false; SetOut(PIN_FPGA_CONF, OUT_HIGH); Barrier(); if (len & 1){ // 奇数 SPI::SetMode(SPI::MODE_8BIT); SPI::SetupTxDMA(data, len); }else{ // 偶数 SPI::SetMode(SPI::MODE_16BIT); SPI::SetupTxDMA(data, len / 2); } SPI::StartDMA(); SPI::WaitTxDMA(); SPI::StopDMA(); Barrier(); SetOut(PIN_FPGA_CONF, OUT_LOW); SPI::Close(); } return true; }
void CLampBuzzer::Seq(void) { g_nv.NDm(blinkOnOff) = m_tmBlink.Blink(TRUE, 500, 500); BOOL bOnOff = g_nv.NDm(blinkOnOff); int nCurState = GetState(); if(m_nOldState != nCurState) { m_tmBuzzer.Reset(); m_nOldState = nCurState; m_bBuzzerOff = FALSE; } // Tower Lamp if(LAMP_ON == m_pConfig->state[nCurState].nGreen) SetOut(oTowerLampG, TRUE); else if(LAMP_OFF == m_pConfig->state[nCurState].nGreen) SetOut(oTowerLampG, FALSE); else SetOut(oTowerLampG, bOnOff); if(LAMP_ON == m_pConfig->state[nCurState].nRed) SetOut(oTowerLampR, TRUE); else if(LAMP_OFF == m_pConfig->state[nCurState].nRed) SetOut(oTowerLampR, FALSE); else SetOut(oTowerLampR, bOnOff); if(LAMP_ON == m_pConfig->state[nCurState].nYellow) SetOut(oTowerLampY, TRUE); else if(LAMP_OFF == m_pConfig->state[nCurState].nYellow) SetOut(oTowerLampY, FALSE); else SetOut(oTowerLampY, bOnOff); //Buzzer On/Off if(m_bBuzzerOff) { BuzzerOnOff(0); } else { int nBuzzerOnTime = (m_pConfig->nAllOffTime * 1000); BOOL bTimeOff = !!m_pConfig->nAllOffUse; if(bTimeOff && m_tmBuzzer.TimeOver(nBuzzerOnTime)) BuzzerOnOff(0); else BuzzerOnOff(m_pConfig->state[nCurState].nBuzzer); } }//--------------------------------------------------------------
void CPneumatic::Actuate(int nCmdDirection) { if(pmFWD == nCmdDirection) SetOut(TRUE, FALSE); else if(pmBWD == nCmdDirection) SetOut(FALSE, TRUE); else if(pmALL_OFF == nCmdDirection) SetOut(FALSE, FALSE); if(m_nCurDirection != nCmdDirection) m_tmDelay.Reset(); m_nCurDirection = nCmdDirection; }//------------------------------------------------------------------
void CUldBtmConv::Auto(void) { g_event.bCanEjectUldMz = FALSE; if(m_fsm.IsRun() || g_nv.NDm(safetyBeam)) return; if(mcSTOP == m_nRun) return; if(g_UldMz.m_fsm.IsInProgress(ULDMZ::C_UNLOADING_START, ULDMZ::C_UNLOADING_END)) return; if(!AOn(iUldOutMzArrival) && !g_opr.bStop) SetOut(oUldOutConvOn, FALSE); if(!AOn(iUldOutMzArrival) && !IsOutOn(oUldOutConvOn)) { g_event.bCanEjectUldMz = TRUE; } else if(AOn(iUldOutMzArrival)) { m_fsm.SetStatus(C_CONV_START); } }//--------------------------------------------------------------
void InitPneumatic(void) { //Set I/O g_pm[VAC_LD_PICKER].SetIO(iVacLdPicker, pmDUMMY_IO, oVacLdPicker, pmDUMMY_IO); g_pm[VAC_ULD_PICKER].SetIO(iVacUldPicker, pmDUMMY_IO, oVacUldPicker, pmDUMMY_IO); g_pm[VAC_FRONT_STAGE].SetIO(iVacFrontStage, pmDUMMY_IO, oVacFrontStage, pmDUMMY_IO); g_pm[VAC_REAR_STAGE].SetIO(iVacRearStage, pmDUMMY_IO, oVacRearSrage, pmDUMMY_IO); //g_pm[CYL_LD_MZ_CLAMP].SetIO(iLdMzClampUp, iLdMzClampDn, oLdMzClampUp, oLdMzClampDn); g_pm[CYL_LD_MZ_CLAMP].SetIO(iLdMzClampUp, pmDUMMY_IO, oLdMzClampUp, oLdMzClampDn); // 95mm 60mm Mz 차이로 인해.. g_pm[CYL_INRAIL_OC].SetIO(iInRailOpen, iInRailClose, oInRailOpen, pmDUMMY_IO); g_pm[CYL_INRAIL_OC_02].SetIO(iInRailOpen02, iInRailClose02, oInRailOpen, pmDUMMY_IO); g_pm[CYL_INRAIL_GUIDE_UD].SetIO(iInRailGuideUp, iInRailGuideDn, oInRailGuideUp, pmDUMMY_IO); g_pm[CYL_GRIPPER_OC].SetIO(iGripperDn, iGripperUp, oGripperDn, pmDUMMY_IO); // 추가 g_pm[CYL_LD_PICKER_UD].SetIO(iLdPickerUp, iLdPickerDn, oLdPickerUp, oLdPickerDn); g_pm[CYL_OUTRAIL_OC].SetIO(iOutRailOpen, iOutRailClose, oOutRailOpen, pmDUMMY_IO); g_pm[CYL_OUTRAIL_OC_02].SetIO(iOutRailOpen02, iOutRailClose02, oOutRailOpen, pmDUMMY_IO); g_pm[CYL_OUTRAIL_GUIDE_UD].SetIO(iOutRailGuideUp, iOutRailGuideDn, oOutRailGuideUp, pmDUMMY_IO); g_pm[CYL_OUTRAIL_PUSHER_FB].SetIO(iOutRailPusherFwd, iOutRailPusherBwd, oOutRailPusherFwd, pmDUMMY_IO); g_pm[CYL_OUTRAIL_PUSHER_UD].SetIO(iOutRailPusherUp, iOutRailPusherDn, pmDUMMY_IO, oOutRailPusherDn); g_pm[CYL_ULD_PICKER_UD].SetIO(iUldPickerUp, iUldPickerDn, oUldPickerUp, oUldPickerDn); //g_pm[CYL_ULD_MZ_CLAMP].SetIO(iUldMzClampUp, iUldMzClampDn, oUldMzClampUp, oUldMzClampDn); g_pm[CYL_ULD_MZ_CLAMP].SetIO(iUldMzClampUp, pmDUMMY_IO, oUldMzClampUp, oUldMzClampDn); // 95mm 60mm Mz 차이로 인해.. //Set Error g_pm[VAC_LD_PICKER].SetErr(7000, ER_VAC_LD_PICKER, pmUNCERTAIN); g_pm[VAC_ULD_PICKER].SetErr(7000, ER_VAC_ULD_PICKER, pmUNCERTAIN); g_pm[VAC_FRONT_STAGE].SetErr(7000, ER_VAC_FRONT_STAGE, pmUNCERTAIN); g_pm[VAC_REAR_STAGE].SetErr(7000, ER_VAC_REAR_STAGE, pmUNCERTAIN); g_pm[CYL_LD_MZ_CLAMP].SetErr(7000, ER_CYL_LD_MZ_CLAMP, pmUNCERTAIN); g_pm[CYL_INRAIL_OC].SetErr(7000, ER_CYL_INRAIL_OC, pmUNCERTAIN); g_pm[CYL_INRAIL_OC_02].SetErr(7000, ER_CYL_INRAIL_OC, pmUNCERTAIN); g_pm[CYL_INRAIL_GUIDE_UD].SetErr(7000, ER_CYL_INRAIL_GUIDE_UD, pmUNCERTAIN); g_pm[CYL_GRIPPER_OC].SetErr(7000, ER_CYL_GRIPPER_OC, pmUNCERTAIN); // 추가 g_pm[CYL_LD_PICKER_UD].SetErr(7000, ER_CYL_LD_PICKER_UD, pmUNCERTAIN); g_pm[CYL_OUTRAIL_OC].SetErr(7000, ER_CYL_OUTRAIL_OC, pmUNCERTAIN); g_pm[CYL_OUTRAIL_OC_02].SetErr(7000, ER_CYL_OUTRAIL_OC, pmUNCERTAIN); g_pm[CYL_OUTRAIL_GUIDE_UD].SetErr(7000, ER_CYL_OUTRAIL_GUIDE_UD, pmUNCERTAIN); g_pm[CYL_OUTRAIL_PUSHER_FB].SetErr(7000, ER_CYL_OUTRAIL_PUSHER_FB, pmBWD); g_pm[CYL_OUTRAIL_PUSHER_UD].SetErr(7000, ER_CYL_OUTRAIL_PUSHER_UD, pmUNCERTAIN); g_pm[CYL_ULD_PICKER_UD].SetErr(7000, ER_CYL_ULD_PICKER_UD, pmUNCERTAIN); g_pm[CYL_ULD_MZ_CLAMP].SetErr(7000, ER_CYL_ULD_MZ_CLAMP, pmUNCERTAIN); //Pm Init Position g_pm[CYL_LD_PICKER_UD].Actuate(pmUP); g_pm[CYL_ULD_PICKER_UD].Actuate(pmUP); g_pm[CYL_OUTRAIL_PUSHER_UD].Actuate(pmUP); g_pm[CYL_OUTRAIL_PUSHER_FB].Actuate(pmBWD); g_pm[CYL_INRAIL_GUIDE_UD].Actuate(pmDOWN); g_pm[CYL_OUTRAIL_GUIDE_UD].Actuate(pmDOWN); SetOut(oMainAirSol, TRUE); }//------------------------------------------------------------------
// FPGAをリセット void Reset(void){ portENTER_CRITICAL(); // パイプが使用中でなかったらリセット //SetDir(PIN_FPGA_AUX0, DIR_IN); // M0ピンに繋がっているのでHi-Zにする //SetDir(PIN_FPGA_AUX1, DIR_IN); // MOSIピンに繋がっているのでHi-Zにする SetOut(PIN_FPGA_nPROG, OUT_LOW); // PROG_BをLow SetDir(PIN_FPGA_nINIT, DIR_OUT); // INIT_BをLow State = FSTATE_NoConf; for(int cnt = 20; 0 < cnt; cnt--){ // ウェイト NOP(); } SetOut(PIN_FPGA_nPROG, OUT_HIGH); // PROG_BをHigh portEXIT_CRITICAL(); }
// データを読み込む bool Read(int address, void *data, int length, bool noinc){ if (State != FSTATE_Running) return false; bool result = SPI::Open(); if (result == true){ unsigned short header[2]; address &= 0x1FFF; if (noinc == false){ address |= 0xA000; }else{ address |= 0x8000; } header[0] = address; header[1] = length; // DMA受信は不安定なので、データの受信はCPUが直接行う SetOut(PIN_FPGA_nCS, OUT_LOW); Barrier(); SPI::SetMode(SPI::MODE_16BIT); AVR32_SPI.rdr; AVR32_SPI.tdr = header[0]; while((AVR32_SPI.sr & AVR32_SPI_SR_RDRF_MASK) == 0); AVR32_SPI.rdr; AVR32_SPI.tdr = header[1]; while((AVR32_SPI.sr & AVR32_SPI_SR_RDRF_MASK) == 0); AVR32_SPI.rdr; while(0 < length){ AVR32_SPI.tdr = 0xFFFF; while((AVR32_SPI.sr & AVR32_SPI_SR_RDRF_MASK) == 0); *(short*)data = AVR32_SPI.rdr; data = (short*)data + 1; length--; } SetOut(PIN_FPGA_nCS, OUT_HIGH); SPI::Close(); } return result; }
int main() { const char *name = "OS_HW1"; // Name of shared memory object to be passed to shm_open int bufSize; // Bounded buffer size int itemCnt; // Number of items to be consumed int shm_fd; // Shared Memory File Descriptor // Write code here to create a shared memory block and map it to gShmPtr // Use the above name // **Extremely Important: map the shared memory block for both reading and writing // Use PROT_READ | PROT_WRITE shm_fd = shm_open(name, O_RDWR , 0666); gShmPtr = mmap(0,SHM_SIZE,PROT_READ | PROT_WRITE,MAP_SHARED,shm_fd,0); // Write code here to read the four integers from the header of the shared memory block // These are: bufSize, itemCnt, in, out // Just call the functions provided below like this: bufSize = GetBufSize(); itemCnt = GetItemCnt(); // Write code here to check that the consumer has read the right values: printf("Consumer reading: bufSize = %d\n",bufSize); printf("Consumer reading: itemCnt = %d\n",itemCnt); printf("Consumer reading: in = %d\n",GetIn()); printf("Consumer reading: out = %d\n",GetOut()); // Write code here to consume all the items produced by the producer // Use the functions provided below to get/set the values of shared variables in, out, bufSize // Use the provided function ReadAtBufIndex() to read from the bounded buffer // **Extremely Important: Remember to set the value of any shared variable you change locally // Use the following print statement to report the consumption of an item: // printf("Consuming Item %d with value %d at Index %d\n", i, val, out); // where i is the item number, val is the item value, out is its index in the bounded buffer int i; for(i=0;i < GetItemCnt(); i++){ while(GetIn() == GetOut()) ; printf("Consuming Item %d with value %d at Index %d\n", i+1, ReadAtBufIndex(GetOut()), GetOut()); //i+1 to show human readable count SetOut((GetOut()+1) % GetBufSize()); } // remove the shared memory segment if (shm_unlink(name) == -1) { printf("Error removing %s\n",name); exit(-1); } return 0; }
void CLampBuzzer::BuzzerOnOff(int nBuzzNo) { SetOut(oBuzzer1, FALSE); SetOut(oBuzzer2, FALSE); SetOut(oBuzzer3, FALSE); SetOut(oBuzzer4, FALSE); if(1 == nBuzzNo) SetOut(oBuzzer1, TRUE); else if(2 == nBuzzNo) SetOut(oBuzzer2, TRUE); else if(3 == nBuzzNo) SetOut(oBuzzer3, TRUE); else if(4 == nBuzzNo) SetOut(oBuzzer4, TRUE); }//--------------------------------------------------------------
// データを書き込む bool Write(int address, short data){ if (State != FSTATE_Running) return false; bool result = SPI::Open(); if (result == true){ unsigned short packet[3]; packet[0] = 0x4000 | (address & 0x1FFF); packet[1] = 1; packet[2] = data; SetOut(PIN_FPGA_nCS,OUT_LOW); Barrier(); SPI::SetMode(SPI::MODE_16BIT); SPI::SetupTxDMA(packet, 3); SPI::StartDMA(); SPI::WaitTxDMA(); SPI::StopDMA(); Barrier(); SetOut(PIN_FPGA_nCS, OUT_HIGH); SPI::Close(); } return result; }
BOOL Init(void) { // PGM 중복 실행 체크 HANDLE hEvent = ::OpenEventA(EVENT_ALL_ACCESS, FALSE, "KOSES_SEQUENCE"); if (NULL != hEvent) { ::MessageBoxA(NULL, "Another sequence is running!!", "Error" , MB_OK); return (FALSE); } else { CreateEventA(NULL, FALSE, FALSE, "KOSES_SEQUENCE"); } // Init Shared memory(kamelas) if(FALSE == g_mmi.Init()) { ::MessageBox(NULL, _T("Failed to Init Communication"), _T("Error") , MB_OK); return (FALSE); } // NV DATA Init.. if(FALSE == g_nv.Init()) { ::MessageBoxA(NULL, "Failed to init nv file.", "Error", MB_OK); return (FALSE); } CAjinLib AjinLib; if(FALSE == AjinLib.Init()) { ::MessageBoxA(NULL, "Failed to init AjinLib.", "Error", MB_OK); return (FALSE); } g_input.m_nModuleCnt = g_input.m_ioConfig.CreateInfo(AXT_SIO_RDI32); if(g_input.m_nModuleCnt != IN_MODULE_CNT) { ::MessageBoxA(NULL, "D/I Module Count Error!!!", "Error", MB_OK); return (FALSE); } g_output.m_nModuleCnt = g_output.m_ioConfig.CreateInfo(AXT_SIO_RDO32); if(g_output.m_nModuleCnt != OUT_MODULE_CNT) { ::MessageBoxA(NULL, "D/O Module Count Error!!!", "Error", MB_OK); return (FALSE); } pIOInst->m_pInAddr = &g_input.m_ch[0]; pIOInst->m_pOutAddr = &g_output.m_ch[0]; g_output.Read(); g_update.Input(); InitAxis(); InitPneumatic(); g_LdMz.Init(); g_InRail.Init(); g_LdPicker.Init(); STAGE::Init(); g_UldPicker.Init(); g_OutRail.Init(); g_UldMz.Init(); g_lampBuzzer.Init(); g_tenkeyOpr.Init(); g_opr.bStop = TRUE; g_opr.bEmg = FALSE; g_opr.bPaused = FALSE; g_opr.bCardInit = FALSE; g_opr.bCycleProgress = FALSE; // Lamp 초기화 g_opr.bManual = FALSE; g_opr.bAir = IsOutOn(oMainAirSol); SetOut(oManualMkLamp, g_opr.bManual); SetOut(oAirSwLamp, IsOutOn(oMainAirSol)); //timer 해상도 결정 timeBeginPeriod(1); return (TRUE); }//------------------------------------------------------------------
void COffRail::Auto(void) { g_event.bCanPushToOffRail = FALSE; g_event.bCanOffRailToUldPicker = FALSE; int nExistErr = IsExistErr(); if(mcSTOP == m_nRun) return; if(m_fsm.IsRun() || g_nv.NDm(safetyBeamLd)) return; if(!m_pMtY->IsRdy()) return; if(g_UldPicker.m_fsm.IsInProgress(ULDPICKER::C_PICKUP_START, ULDPICKER::C_PICKUP_END)) return; if(g_OutRail.m_fsm.IsInProgress(OUTRAIL::C_PUSH_START, OUTRAIL::C_PUSH_END)) return; if(g_OutRail.m_fsm.IsInProgress(OUTRAIL::C_QC_VI_START, OUTRAIL::C_QC_VI_END)) return; if(EXIST_UNCERTAIN == nExistErr) return; if(EXIST_ERR == nExistErr) { m_pInfo->nExist = 2; g_err.Save(ER_OFFRAIL_EXIST); return; } if(0 == (int)g_nv.PkgData(outStripType)) { SetOut(oOffRail_60mm, TRUE); SetOut(oOffRail_775mm, FALSE); } else { SetOut(oOffRail_60mm, FALSE); SetOut(oOffRail_775mm, TRUE); } int nState = GetState(); switch(nState) { case S_IDLE: if(!m_pMtY->IsRdy(P_OFFRAIL_READY)) { if(AOn(i4thRailStripChk3)) { m_pInfo->nExist = 2; g_err.Save(ER_OUT_RAIL_JAM); break; } if(CanMove(P_OFFRAIL_READY)) { m_pMtY->Move(P_OFFRAIL_READY); } } break; case S_RCV_FROM_OFFRAIL: if(m_pMtY->IsRdy(P_OFFRAIL_WORK)) { g_event.bCanPushToOffRail = TRUE; } else { if(AOn(i4thRailStripChk3)) { m_pInfo->nExist = 2; g_err.Save(ER_OUT_RAIL_JAM); break; } if(CanMove(P_OFFRAIL_WORK)) { m_pMtY->Move(P_OFFRAIL_WORK); } } break; case S_REQ_PICKER: if(m_pMtY->IsRdy(P_OFFRAIL_READY)) { g_event.bCanOffRailToUldPicker = TRUE; } else { if(AOn(i4thRailStripChk3)) { m_pInfo->nExist = 2; g_err.Save(ER_OUT_RAIL_JAM); break; } if(CanMove(P_OFFRAIL_READY)) { m_pMtY->Move(P_OFFRAIL_READY); } } break; } }//--------------------------------------------------------------
// 制御用の変数を初期化 void Init(void){ SetOut(PIN_FPGA_nPROG, OUT_HIGH); // PROG_BをHigh }
bool charshell::Handle() { if(!SetWrite()) { return false; } *ostr<<"Begin time: "; WriteTime(); if(!SetMode()) { return false; } if(!SetKey()) { return false; } if(!SetIn()) { return false; } if(!SetOut()) { return false; } if(!Setlog()) { return false; } if(mode == "3" && !SetReout()) { return false; } if(mode == "1") { filedes m_filedes(in, out, key, true); m_filedes.Inicialize(); m_filedes.Process(); } else if(mode == "2") { filedes m_filedes(in, out, key, false); m_filedes.Inicialize(); m_filedes.Process(); } else if(mode == "3") { filedes m_filedes(in, out, key, true); m_filedes.Inicialize(); m_filedes.Process(); out->close(); delete out; out = 0; ifstream iftmp(outPath.c_str(), ios::binary); filedes m_filedes2(&iftmp, reout, key, false); m_filedes2.Inicialize(); m_filedes2.Process(); } *ostr<<"End time: "; WriteTime(); string tmp = ostr->str(); cout<<tmp; *log<<tmp; return false; }