Неполная запись рецепта

Работа с панелями оператора Weintek - подключение, программирование, совмещение с ПЛК

Модераторы: kiv, 8bit, VanMo

Неполная запись рецепта

Сообщение Booster » 09 дек 2022, 08:57

Панель MT8102iE. Использую механизм рецептов для создания архива протоколов испытаний. Протокол формируется в макросе. Суть простая - данные командой GetData копируются из ПЛК в локальные переменные макроса, затем из этих переменных командой SetData "набивается" строчка рецепта, затем в регистр Command записывается значение "1" (добавить новую запись рецепта), после чего взводится системный бит LB-9029 для принудительной записи обновлённых данных в энергонезависимую память. Потом данный набор действий повторяется ещё раз с другими данными (испытывается пара двигателей, поэтому надо формировать два протокола).

Суть проблемы - иногда в некоторые поля рецепта записывается 0, в итоге протокол получается неполный, с пустой ячейкой. Никаких закономерностей обнаружить не смог. Когда заметил эту проблему, вставил задержки Delay между операциями с данными, но это не помогло.

Подскажите, в какую сторону копать. Макрос формирования протоколов прилагаю

Код: Выделить всё
macro_command main()
unsigned short year
unsigned short month
unsigned short day
char StringYear[4]
char StringMonth[2]
char StringDay[2]
char StringDate[10]
char StringMotorType[18]
char StringNumbOstov[20]
char StringNumbYakor[32]
char StringClassIsolGP[6]
char StringClassIsolDPKO[6]
char StingOperator[40]
char StringOR_O[4]
char StringOR_Y[4]
char StringComment[80]
char StringItogo[14]
unsigned short MotorType
unsigned short CI_GP
unsigned short CI_DPKO
unsigned short OR_O
unsigned short OR_Y
unsigned int RI_YC_C
unsigned int RI_GP_C
unsigned int RI_GPYC_C
float RO_GP_C
float RO_DPKO_C
float RO_Y_C
float Pulse_C
float Pulse_H
unsigned short U
unsigned short I
unsigned short F
unsigned short F_Revers
unsigned short High_F
unsigned short MVI
unsigned short Commutation
char StringCommutation[4]
unsigned short T_Air
unsigned short T_Y
unsigned short T_GP
unsigned short T_DPKO
unsigned short T_Collector
unsigned short T_PU_SK
unsigned short T_PU_PK
unsigned int RI_YC_H
unsigned int RI_GP_H
unsigned int RI_GPYC_H
float RO_GP_H
float RO_DPKO_H
float RO_Y_H
unsigned short EPI
unsigned short command=1
bool flag_true=true
bool flag_false=false
unsigned int DWord_one=0xffffffff

//дата
GetData(year, "HMI", LW, 9022, 1)
GetData(month, "HMI", LW, 9021, 1)
GetData(day, "HMI", LW, 9020, 1)
DEC2ASCII(year, StringYear[0], 4)
DEC2ASCII(month, StringMonth[0], 2)
DEC2ASCII(day, StringDay[0], 2)
StringDate[0]=StringYear[0]
StringDate[1]=StringYear[1]
StringDate[2]=StringYear[2]
StringDate[3]=StringYear[3]
StringDate[4]='/'
StringDate[5]=StringMonth[0]
StringDate[6]=StringMonth[1]
StringDate[7]='/'
StringDate[8]=StringDay[0]
StringDate[9]=StringDay[1]
SetData(StringDate[0], "HMI", RECIPE, "Protocol.Date")

//оператор
GetData(StingOperator[0], "HMI", "NameOperator", 40)
SetData(StingOperator[0], "HMI", RECIPE, "Protocol.Operator")

//Двигатель 1
GetData(MotorType, "PLC", "PLC_MotorType", 1)
select case MotorType
   case 1
      String2Unicode("СТК-810У1", StringMotorType[0])
      break
   case 2
      String2Unicode("ЭДП-810У1", StringMotorType[0])
      break
   case 3
      String2Unicode("ЭК-810Ч", StringMotorType[0])
      break                  
end select
SetData(StringMotorType[0], "HMI", RECIPE, "Protocol.Type")
GetData(StringNumbOstov[0], "HMI", "D1_NumbOstov", 20)
SetData(StringNumbOstov[0], "HMI", RECIPE, "Protocol.NumbOstov")
GetData(StringNumbYakor[0], "HMI", "D1_NumbYakor", 32)
SetData(StringNumbYakor[0], "HMI", RECIPE, "Protocol.NumbYakor")
GetData(CI_GP, "PLC", "PLC_D1_CI_GP", 1)
select case CI_GP
   case 1
      String2Unicode("H", StringClassIsolGP[0])
      break
   case 2
      String2Unicode("200", StringClassIsolGP[0])
      break            
end select
SetData(StringClassIsolGP[0], "HMI", RECIPE, "Protocol.ClassIsol_GP")
GetData(CI_DPKO, "PLC", "PLC_D1_CI_DPKO", 1)
select case CI_DPKO
   case 1
      String2Unicode("H", StringClassIsolDPKO[0])
      break
   case 2
      String2Unicode("200", StringClassIsolDPKO[0])
      break            
end select
SetData(StringClassIsolDPKO[0], "HMI", RECIPE, "Protocol.ClassIsol_DPKO")
GetData(OR_O, "PLC", "PLC_D1_OR_O", 1)
select case OR_O
   case 1
      String2Unicode("СР", StringOR_O[0])
      break
   case 2
      String2Unicode("КР", StringOR_O[0])
      break      
end select
SetData(StringOR_O[0], "HMI", RECIPE, "Protocol.OR_O")
GetData(OR_Y, "PLC", "PLC_D1_OR_Y", 1)
select case OR_Y
   case 1
      String2Unicode("СР", StringOR_Y[0])
      break
   case 2
      String2Unicode("КР", StringOR_Y[0])
      break      
end select
SetData(StringOR_Y[0], "HMI", RECIPE, "Protocol.OR_Y")

GetData(RI_GP_C, "PLC", "PLC_D1_R_IsolGP_Cold", 1)
SetData(RI_GP_C, "HMI", RECIPE, "Protocol.RI_GP_C")

GetData(RI_YC_C, "PLC", "PLC_D1_R_IsolYC_Cold", 1)
SetData(RI_YC_C, "HMI", RECIPE, "Protocol.RI_DP_C")

GetData(RI_GPYC_C, "PLC", "PLC_D1_R_IsolObm_Cold", 1)
SetData(RI_GPYC_C, "HMI", RECIPE, "Protocol.RI_GPDP_C")

GetData(Pulse_C, "PLC", "PLC_D1_Pulse_Cold", 1)
SetData(Pulse_C, "HMI", RECIPE, "Protocol.Pulse_C")

GetData(Pulse_H, "PLC", "PLC_D1_Pulse_Hot", 1)
SetData(Pulse_H, "HMI", RECIPE, "Protocol.Pulse_H")

GetData(RO_Y_C, "PLC", "PLC_D1_R_ObmY_Cold", 1)
SetData(RO_Y_C, "HMI", RECIPE, "Protocol.RO_Y_C")

GetData(RO_Y_H, "PLC", "PLC_D1_R_ObmY_Hot", 1)
SetData(RO_Y_H, "HMI", RECIPE, "Protocol.RO_Y_H")

GetData(RO_GP_C, "PLC", "PLC_D1_R_ObmGP_Cold", 1)
SetData(RO_GP_C, "HMI", RECIPE, "Protocol.RO_GP_C")

GetData(RO_GP_H, "PLC", "PLC_D1_R_ObmGP_Hot", 1)
SetData(RO_GP_H, "HMI", RECIPE, "Protocol.RO_GP_H")

GetData(RO_DPKO_C, "PLC", "PLC_D1_R_ObmDP_Cold", 1)
SetData(RO_DPKO_C, "HMI", RECIPE, "Protocol.RO_DPKO_C")

GetData(RO_DPKO_H, "PLC", "PLC_D1_R_ObmDP_Hot", 1)
SetData(RO_DPKO_H, "HMI", RECIPE, "Protocol.RO_DPKO_H")

GetData(U, "PLC", "PLC_D1_U", 1)
SetData(U, "HMI", RECIPE, "Protocol.U")

GetData(I, "PLC", "PLC_D1_I", 1)
SetData(I, "HMI", RECIPE, "Protocol.I")

GetData(F, "PLC", "PLC_D1_F", 1)
SetData(F, "HMI", RECIPE, "Protocol.F")

GetData(F_Revers, "PLC", "PLC_D1_F_Revers", 1)
SetData(F_Revers, "HMI", RECIPE, "Protocol.F_Revers")

GetData(High_F, "PLC", "PLC_D1_High_F", 1)
SetData(High_F, "HMI", RECIPE, "Protocol.High_F")

GetData(MVI, "PLC", "PLC_D1_MVI", 1)
SetData(MVI, "HMI", RECIPE, "Protocol.MVI")

GetData(Commutation, "PLC", "PLC_D1_Commutation", 1)
select case Commutation
   case 1
      String2Unicode("1 ", StringCommutation[0])
      break
   case 2
      String2Unicode("1¼", StringCommutation[0])
      break
   case 3
      String2Unicode("1½", StringCommutation[0])
      break
   case 4
      String2Unicode("2 ", StringCommutation[0])
      break   
   case 5
      String2Unicode("2½", StringCommutation[0])
      break
   case 6
      String2Unicode("3 ", StringCommutation[0])
      break                        
end select
SetData(StringCommutation[0], "HMI", RECIPE, "Protocol.Commutation")

GetData(T_Air, "PLC", "PLC_D1_T_Air", 1)
SetData(T_Air, "HMI", RECIPE, "Protocol.T_Air")

GetData(T_Y, "PLC", "PLC_D1_T_Y", 1)
SetData(T_Y, "HMI", RECIPE, "Protocol.T_Y")

GetData(T_GP, "PLC", "PLC_D1_T_GP", 1)
SetData(T_GP, "HMI", RECIPE, "Protocol.T_GP")

GetData(T_DPKO, "PLC", "PLC_D1_T_DPKO", 1)
SetData(T_DPKO, "HMI", RECIPE, "Protocol.T_DPKO")

GetData(T_Collector, "PLC", "PLC_D1_T_Collector", 1)
SetData(T_Collector, "HMI", RECIPE, "Protocol.T_Collector")

GetData(T_PU_SK, "PLC", "PLC_D1_T_Bearing1", 1)
SetData(T_PU_SK, "HMI", RECIPE, "Protocol.T_PU_SK")

GetData(T_PU_PK, "PLC", "PLC_D1_T_Bearing2", 1)
SetData(T_PU_PK, "HMI", RECIPE, "Protocol.T_PU_PK")

GetData(RI_GP_H, "PLC", "PLC_D1_R_IsolGP_Hot", 1)
SetData(RI_GP_H, "HMI", RECIPE, "Protocol.RI_GP_H")

GetData(RI_YC_H, "PLC", "PLC_D1_R_IsolYC_Hot", 1)
SetData(RI_YC_H, "HMI", RECIPE, "Protocol.RI_DP_H")

GetData(RI_GPYC_H, "PLC", "PLC_D1_R_IsolObm_Hot", 1)
SetData(RI_GPYC_H, "HMI", RECIPE, "Protocol.RI_GPDP_H")

GetData(EPI, "PLC", "PLC_D1_EPI", 1)
SetData(EPI, "HMI", RECIPE, "Protocol.EPI")

String2Unicode("годен", StringItogo[0])
SetData(StringItogo[0], "HMI", RECIPE, "Protocol.Itogo")

String2Unicode("                                        ", StringComment[0])
SetData(StringComment[0], "HMI", RECIPE, "Protocol.Comment")

SetData(DWord_one, "HMI", RECIPE, "Protocol.ServiceWord")
DELAY(1000)
SetData(command, "HMI", RECIPE, "Protocol.Command")
DELAY(2000)
SetData(flag_true, "HMI", LB, 9029, 1)//принудительно сохранить рецепт
DELAY(1000)

//Двигатель 2
GetData(MotorType, "PLC", "PLC_MotorType", 1)
select case MotorType
   case 1
      String2Unicode("СТК-810У1", StringMotorType[0])
      break
   case 2
      String2Unicode("ЭДП-810У1", StringMotorType[0])
      break
   case 3
      String2Unicode("ЭК-810Ч", StringMotorType[0])
      break                  
end select
SetData(StringMotorType[0], "HMI", RECIPE, "Protocol.Type")
GetData(StringNumbOstov[0], "HMI", "D2_NumbOstov", 20)
SetData(StringNumbOstov[0], "HMI", RECIPE, "Protocol.NumbOstov")
GetData(StringNumbYakor[0], "HMI", "D2_NumbYakor", 32)
SetData(StringNumbYakor[0], "HMI", RECIPE, "Protocol.NumbYakor")
GetData(CI_GP, "PLC", "PLC_D2_CI_GP", 1)
select case CI_GP
   case 1
      String2Unicode("H", StringClassIsolGP[0])
      break
   case 2
      String2Unicode("200", StringClassIsolGP[0])
      break            
end select
SetData(StringClassIsolGP[0], "HMI", RECIPE, "Protocol.ClassIsol_GP")
GetData(CI_DPKO, "PLC", "PLC_D2_CI_DPKO", 1)
select case CI_DPKO
   case 1
      String2Unicode("H", StringClassIsolDPKO[0])
      break
   case 2
      String2Unicode("200", StringClassIsolDPKO[0])
      break            
end select
SetData(StringClassIsolDPKO[0], "HMI", RECIPE, "Protocol.ClassIsol_DPKO")
GetData(OR_O, "PLC", "PLC_D2_OR_O", 1)
select case OR_O
   case 1
      String2Unicode("СР", StringOR_O[0])
      break
   case 2
      String2Unicode("КР", StringOR_O[0])
      break      
end select
SetData(StringOR_O[0], "HMI", RECIPE, "Protocol.OR_O")
GetData(OR_Y, "PLC", "PLC_D2_OR_Y", 1)
select case OR_Y
   case 1
      String2Unicode("СР", StringOR_Y[0])
      break
   case 2
      String2Unicode("КР", StringOR_Y[0])
      break      
end select
SetData(StringOR_Y[0], "HMI", RECIPE, "Protocol.OR_Y")

GetData(RI_GP_C, "PLC", "PLC_D2_R_IsolGP_Cold", 1)
SetData(RI_GP_C, "HMI", RECIPE, "Protocol.RI_GP_C")

GetData(RI_YC_C, "PLC", "PLC_D2_R_IsolYC_Cold", 1)
SetData(RI_YC_C, "HMI", RECIPE, "Protocol.RI_DP_C")

GetData(RI_GPYC_C, "PLC", "PLC_D2_R_IsolObm_Cold", 1)
SetData(RI_GPYC_C, "HMI", RECIPE, "Protocol.RI_GPDP_C")

GetData(Pulse_C, "PLC", "PLC_D2_Pulse_Cold", 1)
SetData(Pulse_C, "HMI", RECIPE, "Protocol.Pulse_C")

GetData(Pulse_H, "PLC", "PLC_D2_Pulse_Hot", 1)
SetData(Pulse_H, "HMI", RECIPE, "Protocol.Pulse_H")

GetData(RO_Y_C, "PLC", "PLC_D2_R_ObmY_Cold", 1)
SetData(RO_Y_C, "HMI", RECIPE, "Protocol.RO_Y_C")

GetData(RO_Y_H, "PLC", "PLC_D2_R_ObmY_Hot", 1)
SetData(RO_Y_H, "HMI", RECIPE, "Protocol.RO_Y_H")

GetData(RO_GP_C, "PLC", "PLC_D2_R_ObmGP_Cold", 1)
SetData(RO_GP_C, "HMI", RECIPE, "Protocol.RO_GP_C")

GetData(RO_GP_H, "PLC", "PLC_D2_R_ObmGP_Hot", 1)
SetData(RO_GP_H, "HMI", RECIPE, "Protocol.RO_GP_H")

GetData(RO_DPKO_C, "PLC", "PLC_D2_R_ObmDP_Cold", 1)
SetData(RO_DPKO_C, "HMI", RECIPE, "Protocol.RO_DPKO_C")

GetData(RO_DPKO_H, "PLC", "PLC_D2_R_ObmDP_Hot", 1)
SetData(RO_DPKO_H, "HMI", RECIPE, "Protocol.RO_DPKO_H")

GetData(U, "PLC", "PLC_D2_U", 1)
SetData(U, "HMI", RECIPE, "Protocol.U")

GetData(I, "PLC", "PLC_D2_I", 1)
SetData(I, "HMI", RECIPE, "Protocol.I")

GetData(F, "PLC", "PLC_D2_F", 1)
SetData(F, "HMI", RECIPE, "Protocol.F")

GetData(F_Revers, "PLC", "PLC_D2_F_Revers", 1)
SetData(F_Revers, "HMI", RECIPE, "Protocol.F_Revers")

GetData(High_F, "PLC", "PLC_D2_High_F", 1)
SetData(High_F, "HMI", RECIPE, "Protocol.High_F")

GetData(MVI, "PLC", "PLC_D2_MVI", 1)
SetData(MVI, "HMI", RECIPE, "Protocol.MVI")

GetData(Commutation, "PLC", "PLC_D2_Commutation", 1)
select case Commutation
   case 1
      String2Unicode("1 ", StringCommutation[0])
      break
   case 2
      String2Unicode("1¼", StringCommutation[0])
      break
   case 3
      String2Unicode("1½", StringCommutation[0])
      break
   case 4
      String2Unicode("2 ", StringCommutation[0])
      break   
   case 5
      String2Unicode("2½", StringCommutation[0])
      break
   case 6
      String2Unicode("3 ", StringCommutation[0])
      break                        
end select
SetData(StringCommutation[0], "HMI", RECIPE, "Protocol.Commutation")

GetData(T_Air, "PLC", "PLC_D2_T_Air", 1)
SetData(T_Air, "HMI", RECIPE, "Protocol.T_Air")

GetData(T_Y, "PLC", "PLC_D2_T_Y", 1)
SetData(T_Y, "HMI", RECIPE, "Protocol.T_Y")

GetData(T_GP, "PLC", "PLC_D2_T_GP", 1)
SetData(T_GP, "HMI", RECIPE, "Protocol.T_GP")

GetData(T_DPKO, "PLC", "PLC_D2_T_DPKO", 1)
SetData(T_DPKO, "HMI", RECIPE, "Protocol.T_DPKO")

GetData(T_Collector, "PLC", "PLC_D2_T_Collector", 1)
SetData(T_Collector, "HMI", RECIPE, "Protocol.T_Collector")

GetData(T_PU_SK, "PLC", "PLC_D2_T_Bearing1", 1)
SetData(T_PU_SK, "HMI", RECIPE, "Protocol.T_PU_SK")

GetData(T_PU_PK, "PLC", "PLC_D2_T_Bearing2", 1)
SetData(T_PU_PK, "HMI", RECIPE, "Protocol.T_PU_PK")

GetData(RI_GP_H, "PLC", "PLC_D2_R_IsolGP_Hot", 1)
SetData(RI_GP_H, "HMI", RECIPE, "Protocol.RI_GP_H")

GetData(RI_YC_H, "PLC", "PLC_D2_R_IsolYC_Hot", 1)
SetData(RI_YC_H, "HMI", RECIPE, "Protocol.RI_DP_H")

GetData(RI_GPYC_H, "PLC", "PLC_D2_R_IsolObm_Hot", 1)
SetData(RI_GPYC_H, "HMI", RECIPE, "Protocol.RI_GPDP_H")

GetData(EPI, "PLC", "PLC_D2_EPI", 1)
SetData(EPI, "HMI", RECIPE, "Protocol.EPI")

String2Unicode("годен", StringItogo[0])
SetData(StringItogo[0], "HMI", RECIPE, "Protocol.Itogo")

String2Unicode("                                        ", StringComment[0])
SetData(StringComment[0], "HMI", RECIPE, "Protocol.Comment")

SetData(DWord_one, "HMI", RECIPE, "Protocol.ServiceWord")
DELAY(1000)
SetData(command, "HMI", RECIPE, "Protocol.Command")
DELAY(2000)
SetData(flag_true, "HMI", LB, 9029, 1)//принудительно сохранить рецепт
DELAY(1000)
SetData(flag_true, "PLC", "PLC_ButtonGreen_Visible", 1)
end macro_command
Booster
 
Сообщения: 2
Зарегистрирован: 16 июн 2016, 14:38

Re: Неполная запись рецепта

Сообщение 8bit » 09 дек 2022, 17:24

Суть проблемы - иногда в некоторые поля рецепта записывается 0

1) проверяйте исходные поля на наличие 0 (если это запрещенное значение по технологии) перед запись данных в рецепт
2) в исходных данных нет ли 0 в такие моменты ?
Хороший вопрос содержит половину ответа - A good question contains half the answer
Аватара пользователя
8bit
 
Сообщения: 1108
Зарегистрирован: 20 апр 2020, 19:07


Вернуться в Weintek

Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot], Google [Bot] и гости: 9