#O nome da função deve ser o nome deste arquivo *.m function ProvasOnline_Piloto #Provas Online no Moodle, baseado em questionários (Quiz) #Máscara ORGANIZADA por Milana, com base em código originais e funções MUITO BOAS criadas por Eduardo Pellini % Aqui devem ser listadas todas as variações para os dados de entrada label_entrada={ 'P1', 'Q1', 'Valim1', 'VAB_abs1', 'VAB_ang1', ... %Entradas da questão 1 'Pmec2', 'Valim2', 'rend2', 'fp2',... %Entradas da questão 2 'Valim3', 'Zan3', 'Zbn3', 'Zcn3' }; entrada={ '50', '20', '200', '220', '12',... %Entradas da questão 1 '5', '220', '85', '82',... %Entradas da questão 2 '220', '10', 'j*10', '-j*10' %Entradas da questão 3 '70', '30', '200', '220', '12',... %Entradas da questão 1 '6', '220' '87', '79' ,... %Entradas da questão 2 '220', 'j*10', '10', '-j*10' %Entradas da questão 3 '80', '40', '200', '220', '12',... %Entradas da questão 1 '5', '220', '85', '82',... %Entradas da questão 2 '380', 'j*10', '10', '-j*10' %Entradas da questão 3 '70', '30', '200', '220', '12',... %Entradas da questão 1 '6', '220' '87', '79' ,... %Entradas da questão 2 '380', '10', 'j*10', '-j*10' %Entradas da questão 3 }; %Para facilitar a conferência, os valores de entrada e as respostas podem ir para um arquivo csv. %Basta colocar aqui as variáveis que deseja incluir no csv. listagem={'P1', 'Q1', 'Valim1', 'VAB_abs1', 'VAB_ang1','real(ZcteY1)','imag(ZcteY1)','abs(corrLinha1)','arg(corrLinha1)/pi*180',... 'Pmec2', 'Valim2', 'rend2', 'fp2','P2','corrLinha2',... 'Valim3', 'real(Zan3)','imag(Zan3)', 'real(Zbn3)','imag(Zbn3)','real(Zcn3)','imag(Zcn3)','abs(VAN3)','arg(VAN3)/pi*180','abs(VNNLinha3)','arg(VNNLinha3)/pi*180','VcargaAN3','VcargaBN3','VcargaCN3','IA','IB','IC','S3','W13','W23' }; titulo = 'ProvaMilana'; arq_csv=fopen(cstrcat(cstrcat('ProvaOnline_',titulo), '.csv'), 'w'); fprintf(arq_csv,'%s \n',strjoin(listagem,",")); arq=fopen(cstrcat(cstrcat('ProvaOnline_',titulo), '.xml'), 'w'); cabecalho={ '' '' [''] ' ' '' '' ['$module$/top/',titulo,''] '' '' 'Nome da categoria gerado automaticamente.' '' '' '' }; for cont=1:length(cabecalho) fprintf(arq,'%s \n',cabecalho{cont}); end for c=1:size(entrada,1) for c2=1:size(entrada,2) if ~isempty(num2str(entrada{c,c2})) instr=[label_entrada{c2},' = str2num(entrada{c,c2});']; else instr=[label_entrada{c2},' = entrada{c,c2};']; end eval(instr); end ##display(Valim1); PesoTotal=0; XMLQuestionBegin(arq, 'Prova P1'); %1a questão - corrente de linha ZcteY1=abs(Valim1)^2/(conj(P1+j*Q1)); VAB1=VAB_abs1*exp(j*VAB_ang1/180*pi)*1000; VAN1=VAB1/(sqrt(3)*exp(-j*30/180*pi)); %seq. inversa corrLinha1=VAN1/ZcteY1; %Lista de respostas solicitadas. É necessário ter números inteiros como peso %A função ClozeEntry (descrita ao final deste script, criada por Pellini), recebe quatro argumentos, a saber: % peso da questão (sempre valor inteiro), valor numérico correto, tolerância (relativa) % para a resposta ser correta, e tolerância para a resposta ser parcial % IMPORTANTE: se a resposta correta for zero, a tolerancia será adotada de forma absoluta. respCorrenteLinhaAbs1 = ClozeEntry(4, abs(corrLinha1), 0.02, 0.04); respCorrenteLinhaAng1 = ClozeEntry(4, arg(corrLinha1)/pi*180, 0.04, 0.08); %Valores de ângulo podem ter tolerância maior %2a questão - corrente de linha P2=Pmec2*746/(rend2/100); corrLinha2=P2/(sqrt(3)*Valim2*(fp2/100)); %Lista de respostas solicitadas. É necessário ter números inteiros como peso respCorrenteLinhaAbs2 = ClozeEntry(8, abs(corrLinha2), 0.02, 0.04); %3a questão VAB3=Valim3*exp(j*pi/6); %VAB com ângulo 30 VAN3=VAB3/(sqrt(3)*exp(j*pi/6)); alfa=cos(2/3*pi)+j*sin(2/3*pi); VBC3=alfa^2*VAB3; VCA3=alfa*VAB3; VBN3=VAN3*alfa^2; VCN3=VAN3*alfa; VNNLinha3=(VAN3/Zan3+VBN3/Zbn3+VCN3/Zcn3)/(1/Zan3+1/Zbn3+1/Zcn3); VcargaAN3=VAN3-VNNLinha3; VcargaBN3=VBN3-VNNLinha3; VcargaCN3=VCN3-VNNLinha3; IA=VcargaAN3/Zan3; IB=VcargaBN3/Zbn3; IC=VcargaCN3/Zcn3; S3=VcargaAN3*conj(IA)+VcargaBN3*conj(IB)+VcargaCN3*conj(IC); W13=real(-VCA3*conj(IA)); W23=real(VBC3*conj(IB)); %Lista de respostas solicitadas. É necessário ter números inteiros como peso respVcargaANAbs3=ClozeEntry(3, abs(VcargaAN3), 0.02, 0.04); respVcargaBNAbs3=ClozeEntry(3, abs(VcargaBN3), 0.02, 0.04); respVcargaCNAbs3=ClozeEntry(3, abs(VcargaCN3), 0.02, 0.04); respIAAbs3=ClozeEntry(3, abs(IA), 0.02, 0.04); respIBAbs3=ClozeEntry(3, abs(IB), 0.02, 0.04); respICAbs3=ClozeEntry(3, abs(IC), 0.02, 0.04); respPcarga3=ClozeEntry(2, real(S3), 0.02, 0.04); respQcarga3=ClozeEntry(2, imag(S3), 0.2, 0.4); respW13=ClozeEntry(1, W13, 0.02, 0.04); respW23=ClozeEntry(1, W23, 0.02, 0.04); TextoProva = { ['

Questão 1 (ex. 1.19 Robba) Um sistema trifásico simétrico ',... 'alimenta carga equilibrada, formada por três impedâncias constantes iguais, que absorve ',... num2str(P1),' MW e ',num2str(Q1),' MVAr quando alimentada por tensão de ',... num2str(Valim1),' kV. Sendo a sequência de fases inversa e a tensão ',... '\( \dot{V} \)AB = ',num2str(VAB_abs1),' kV \( \angle \) ',num2str(VAB_ang1),'° , ',... 'pedimos determinar a corrente de linha na fase A: ',respCorrenteLinhaAbs1,' A ',... '\( \angle \) ',respCorrenteLinhaAng1,' ° .

',... 'Questão 2: (ex. 5.2.18) Um motor trifásico com potência ',... 'mecânica nominal de ',num2str(Pmec2),' hp, de ',num2str(Valim2),' V, tem, a ',... 'plena carga, rendimento de ',num2str(rend2),'% e fator de potência de ',... num2str(fp2),'% indutivo. Considere 1 hp = 746 W. Pedimos determinar a corrente de linha a ',... 'plena carga: ',respCorrenteLinhaAbs2,' A.',... '

Questão 3: (ex. 5.2.21) Para o circuito da figura,',... 'sabemos que o trifásico é simétrico de sequência direta, com tensão de linha ',... num2str(Valim3),' V, 60 Hz, sequência de fase direta, e as impedâncias das cargas ',... 'nas três fases valem:

',... '

a) as tensões de fase na carga: ',... '\( \dot{V}_{AN''} \) = ',respVcargaANAbs3,' V ; ',... '\( \dot{V}_{BN''} \) = ',respVcargaBNAbs3,' V ; ',... '\( \dot{V}_{CN''} \) = ',respVcargaCNAbs3,' V ;',... '

b) as correntes de linha: ',... '\( \dot{I}_{A} \) = ',respIAAbs3,' A , ',... '\( \dot{I}_{B} \) = ',respIBAbs3,' A , ',... '\( \dot{I}_{C} \) = ',respICAbs3,' A ;',... '

c) A potência complexa fornecida à carga: ',respPcarga3,' W + j',respQcarga3,' VAr;',... '

d) As leituras nos wattímetros: W1 = ',respW13,' W ; W2 = ',respW23,' W.'] }; for cont=1:length(TextoProva) fprintf(arq,'%s',TextoProva{cont}); end XMLQuestionEnd(arq); for cont=1:length(listagem) fprintf(arq_csv,'%f,',eval(listagem{cont})); end fprintf(arq_csv,'\n'); endfor fprintf(arq, '\n\n'); fclose(arq); fclose(arq_csv); endfunction ## Funções ## Copyright (C) 2020 elpel_000 ## ## This program is free software: you can redistribute it and/or modify it ## under the terms of the GNU General Public License as published by ## the Free Software Foundation, either version 3 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program. If not, see ## . ## -*- texinfo -*- ## @deftypefn {} {@var{retval} =} funcs (@var{input1}, @var{input2}) ## ## @seealso{} ## @end deftypefn ## Author: elpel_000 ## Created: 2020-02-22 1; %Calcula a tolerancia absoluta para um dado valor a partir de uma tolerancia %em p.u. (valor unitario). Se por acaso o valor for zero, adota como tolerancia %absoluta o próprio valor da tolerancia em p.u. function Tolerancia = CalcTol(valor, tol_pu) if(abs(valor) < 0.00001) Tolerancia = abs(tol_pu); else Tolerancia = abs(valor * tol_pu); end; endfunction; %Retorna uma fase em graus a partir de uma fase em radianos %Mantendo o conjunto imagem entre -180 a + 180 %Atenção: Essa função não é muito segura, pois se a fase em radianos for maior %que 2pi ou menor que -2pi, o angulo resultante pode ser maior que o conj. imagem %pretendido function Fase = FaseDeg(FaseRad) TFase = (FaseRad / pi) * 180.0; if(TFase>180) Fase = TFase - 360; elseif(TFase<-180) Fase = 360 + TFase; else Fase = TFase; endif endfunction; %Faz printf de uma valor em module fase, com fase em graus function print_comp_pol (number) modulus = abs(number); phase = FaseDeg(arg(number)); printf(' %3.3f<%3.3f ',modulus, phase); endfunction; %Faz printf de uma valor em parte real e imaginaria function print_real_imag (number) realpar=real(number); imagpar=imag(number); if(imagpar<0) printf(' %3.3f - j*%3.3f ',realpar, abs(imagpar)); else printf(' %3.3f + j*%3.3f ',realpar, imagpar); end endfunction; %Inicializa um numero completo através da insercao de suas coordenadas polares %em módulo e fase function FasorPolDeg = FasorModFase(modulo, fase) arg = (fase * pi)/180.0; FasorPolDeg = modulo * (cos(arg)+i*sin(arg)); end; %Coloca um preemabulo em XML no arquivo arq para uma Cloze question com nome %qname do moodle. Logo após o preembulo, deve ser feito o fprintf para o arquivo %com uma string com o texto da questão em HTML com os respectivos entries cloze %para cada campo numérico desejado. function XMLQuestionBegin(arq, qname) fprintf(arq, '\n', qname); fprintf(arq, '\n'); fprintf(arq, '%s\n',qname); fprintf(arq, '\n'); fprintf(arq, '\n'); fprintf(arq, '\n'); fprintf(arq, '\n'); fprintf(arq, '\n'); fprintf(arq, '\n'); fprintf(arq, '\n'); fprintf(arq, '0\n'); fprintf(arq, '\n\n\n'); endfunction global PesoTotal=0; %Cria uma entry Cloze NUMERICAL com o peso, valor da resposta, tolerancia %para 100% de acerto e tolerancia para 50% de acerto. As tolerancias são em valor %percentual unitario daquilo desejado. %Ex. Valor = 5, tolerancia = 0.2 --> 5-1 <= resp_certa <= 5+1 function ClozeString = ClozeEntry(peso, valor, tol1, tol2) global PesoTotal; tolerancia = CalcTol(valor, tol1); tolerancia2 = CalcTol(valor, tol2); ClozeString = sprintf('{%d:NUMERICAL:%%100%%%3.3f:%3.3f#Resposta correta!~%%50%%%3.3f:%3.3f#Resposta próxima, mas imprecisa. Será atribuida metade da pontuação da questão.}', peso, valor, tolerancia, valor, tolerancia2); PesoTotal = PesoTotal + peso; endfunction