Pesquisar neste blog

16/03/2022

Comandos no SQL Server #3














FUNÇÕES NO SQL SERVER

Funções em T-SQL: São rotinas que retornam valores ou tabelas. Com elas
você poderá construir visões parametrizadas ou ainda construir suas próprias
funções, semelhantes a DATE(), Rtrim() dentre outras.

Existem 3 tipos de funções possíveis
- Scalar-valued user-defined function
- Multi-statement table-valued function
- inline table-valued function 

Funções Escalares: Retornam um valor único de dados do tipo definido
na cláusula RETURNS. Para uma função escalar embutida, não há um corpo
de função; o valor escalar é o resultado de uma única instrução. O retorno
pode ser qualquer tipo de dados, execeto text, ntext, image, cursor e timestamp.

-- função para excluir
CREATE FUNCTION Trim(@ST VARCHAR (1000
  returns VARCHAR?(1000)
   BEGIN
     RETURN (Ltrim(Rtrim(@ST))) --remove os espaços na esquerda
   END


--Excemplo função eslar TRIM
SELECT '>' + ('  Silva Telles   ')+'<' union
SELECT '>' + DBO.TRIM('   Silva Telles      ') + '<'


____________________________//__________________________

Exemplo 2

--GERANDO A FUNÇÃO
CREATE FUNCTION inventario(@ProductID INT) 
  return INT AS
-- Retorna estoque de produto
BEGIN 
  DECLARE @ret INT;
  SELECT @ret = Sum(p.quantity)
FROM production.productinventory p
      WHERE p.productid = @ProductID
AND p.localionid = '6';
     IF ( @ret IS NULL)
     SET @ret = 0;
     RETURN @ret;
     END;

--Invocando a função inventario
SELECT productmodelid, name, dbo.inventario(productid) 
    AS Estoque_atual
      FROM production.product
    WHERE productmodelid BETWEEN 75 AND 80;


_______________________________//_______________________________

Procedures (Procedimentos armazenados)
Um procedimento armazenado é um tipo especial de script escrito eem Transact-SQL,
usando a linguagem SQL e extensões SQL. Os procedimentos são salvos em um 
servidor de banco de dados para aperfeiçoar o desempenho e a consistência das 
tarefas repetitivas.
Procedimentos armazenados podem ser usados para as seguintes tarefas:
- Controlar autorização de acesso
- Criar um caminho de auditoria de atividades em tabelas de banco de dados
- Separar instruções de definição e de manipulação de dados relativas a um banco de
dados das aplicações que o acessam.

--Retornar apenas o conteúdo estático

CREATE PROCEDURE TESTE1 
 AS BEGIN SELECT 'O famoso hello world!'
   END

--Executando Procedure
EXEC TESTE1 

_______________________________/ / _____________________________


TRIGGERS: É um bloco de comandos Transact-SQL que é automaticamente executado 
quando um comando INSERT, DELETE ou UPDATE for executado em uma tabela do banco de dados.
Os Triggers são usados para realizar tarefas relacionadas com validações, restrições de 
acesso, rotinas de segurança e consistência de dados; desta forma estes controles deixam
de ser executados pela aplicação e passam a ser executados pelos Triggerss em determinadas
situações.

Sintaxe:
CREATE TRIGGER [nome do trigger] ON [nome da tabela]
  [FOR/AFTER/INSTEAD OF] [INSERT/UPDATE/DELETE] AS
    --CORPO DO TRIGGER

--Os parâmetros são:
NOME DO TRIGGER:
NOME DA TABELA: Tabela â qual o gatilho estará ligado, para ser disparado mediante
ações de insert, update ou delete.
FOR/AFTER/INSTEAD OF: uma dessas opções deve ser escolhida para definir o momento em
que o trigger será disparado.
INSERT/UPDATE/DELETE: uma ou várias dessas opções (separadas por vírgula) devem ser
indicadas para informar ao banco qual é a ação que disparará o gatilho.

Existem 2 tipos de triggers:
- DML (Acionadas através de comandos de manipulação de dados)
- DDL ((Acionadas através de comandos de definição de objetos no banco de dados)

Exemplo:
CREATE TRIGGER tg_aud_sal --unico registro
  ON salario AFTER UPDATE AS BEGIN
DECLARE @sal_antigo DECIMAL (10,2)
DECLARE @sal_novo DECIMAL (10,2)
DECLARE @matricula int

SELECT @matricula = (SELECT matricula FROM inserted)
SELECT @sal_antigo = (SELECT salario FROM deleted)
SELECT @sal_novo = (SELECT salario FROM inserted)

   INSERT INTO auditoria_salario VALUES
     (@matricula isnull (@sal_antigo, 0), @sal_novo, SYSTER_USER, getdate)__
   END


--Testando triggers
upadate salario set salario = '2500' where matricula = '1'
upadate salario set salario = '3000' where matricula = '2'

select *from auditoria_salario 


________________________ / / _______________________________________

TRIGGER no SQL Server

ALTER TRIGER trg_atualiza_saldo_cc ON conta_corrente --aluliza saldo onde a conta corrente recebe
FOR INSERT AS --inclui um registro 
  BEGIN 
    DECLARE @CONTA_C VARCHAR(20),--declara algumas variaveis
         @VALOR DECIMAL (10, 2),
         @OPER CHAR(1)
    SELECT @CONTA_C = I.conta_c,--faz a seleção
           @VALOR = I.valor,
   @OPER = I.operacao
    FROM inserted I -- e atribui o insert das variavéis
D = debito   C = crédito
   IF @OPER NOT IN ('D', 'C') BEGIN
     PRINT 'OPERACAO NAO PERMITIDA' 

ROLL BACK TRANSACTION 
    END
   ELSE IF (SELECT Count(*)
     FROM saldo_conta
     WHERE conta_c = @conta_c) = 0
    AND @OPER = 'D' -- e operação igual à débito
    BEGIN
      INSERT INTO saldo_conta
      VALUES   (@CONTA_C, @VALOR *-1) -- se está emprestando entao fica devendo
   END
  ELSE IF (SELECT Count(*)
    FROM saldo_conta
    WHERE conta_c = @conta_c) = 0
   AND @OPER = 'C'
   BEGIN
  INSERT INTO saldo_conta
  SET saldo = saldo + @VALOR
WHERE conta_c = @CONTA_C
   END
  ELSE IF (SELECT Count(*)
FROM saldo_conta
WHERE conta_c = @conta_c) > 0
AND @OPER = 'D'
     BEGIN
    UPDATE saldo_conta
SET saldo = saldo - @VALOR
WHERE conta_c = @CONTA_C
    END
END


Palavras chave:

FUNCIONES EN SERVIDOR SQL
FUNGSI ING SQL SERVER
פונקציות ב-SQL SERVER
ФУНКЦИИ В SQL СЕРВЕРЕ
ФУНКЦІЇ В SQL СЕРВЕРУ
SQL सर्भरमा कार्यहरू
CÁC CHỨC NĂNG TRONG SQL SERVER
MGA FUNCTION SA SQL SERVER
FUNKCIJE U SQL SERVERU
FUNCIONS EN SQL SERVER
FUNCIONS EN SQL SERVER

27/02/2022

Desafio #1 - Contador

Faça um contador que inicie com o número final da matricula e depois comece a contar de 0 a 99 e retorne em forma decrescente. Obs: matrícula = 2022178440488

Resolução:

CÓDIGO FEITO EM CCS C COMPILER

#include <16F877A.h>
#device ADC = 8
#use delay(crystal = 20MHz)
#define tempo 400

int v1[] = {0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110, 0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01100111};
int tam = sizeof(v1)/sizeof(int);

void contador(int valor1){
   output_b(0b00111111);
   output_d(0b01111111);
   delay_ms(1000);
   
   for(int i = valor1; i < tam; i++){
      output_d(v1[i]);
      delay_ms(tempo);
   }
   
   for(i = 1; i < tam; i++){
      for(int j = 0; j < tam; j++){
         output_b(v1[i]);
         output_d(v1[j]);
         delay_ms(tempo);
      }
   }
      
}

void main(){
   
    contador(8);
        
   while(true){      
      
      delay_ms(1000);
      
      for(int i = tam; i > 0; i--){
         for( int j = 10; j > 0; j--){
            output_b(v1[i-1]);
            output_d(v1[j-1]);
            delay_ms(tempo);
         }
      }
      
      delay_ms(1000);
      
      for (i = 0; i < tam; i++){
         for( int j = 0; j < tam; j++){
            output_b(v1[i]);
            output_d(v1[j]);
            delay_ms(tempo);
         }
      }
     
   }
}



















Resolução 2 feita em no PicSimlab

Código feito em CCS C Compiler

#include <16F877A.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES LP                       //Low power osc < 200 khz
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection

#use delay(clock = 20MHz)
#define delay 50

unsigned int i = 0, tempo, cont = 8;

byte const luz [10]={
   0b0111111, //0
   0b0000110, //1
   0b1011011, //2
   0b1001111, //3
   0b1100110, //4
   0b1101101, //5
   0b1111101, //6
   0b0100111, //7
   0b1111111, //8
   0b1101111  //9
};
  
byte const display []={
   0b000000,  // display desligado
   0b000100, // display 1
   0b001000, // display 2
   0b010000, // display 3
   0b100000,  // display 4
   0b1101101, //5
   0b1111101, //6
   0b0100111, //7
   0b1111111, //8
};

void main(){
   
   while(true){
   
      for(tempo = 0; tempo < 10; tempo++){
         i = cont/10;
         output_a(display[7]);
         output_d(luz[i]);
         delay_ms(delay);
  
         i = cont%10;
         output_a(display[4]);
         output_d(luz[i]);
         delay_ms(delay);
      }
      if(++cont >= 100)cont = 8;
      
   }
}



21/02/2022

1) Uma pessoa compra um pote com ovinhos de chocolate e, ao fazer pacotinhos, todos com a mesma quantidade percebeu que colocando 8 ou 9 ou 12 ovinhos em cada pacotinho sempre sobrariam 3 ovinhos no pote. O menor número de ovinhos é: 

Resolução:

8, 9 , 12 | 2
4 , 9, 6  | 2
2 , 9 , 6 | 2
1, 9, 3 | 3
1 , 3, 1 | 3
1 , 1, 1

22 . 32 = 72 + 3 = 75 ovinhos


2) Na linha 1 de 1 sistema métrico os trem partem em 2,4 min. Na linha 2 desse mesmo sistema, os trens partem 1,8 min. Se 2 trens partem simultaneamente das linhas 1 e 2 às 13 horas próximo horário simultaneamente qual será o horário das duas linhas.

Resolução:


24, 18 | 2
12, 9 | 2
6 , 9 | 2
3 , 9 | 3
1 , 3 | 3
1 , 1

22 . 32 = 72 = 7,2 min


3) Quais os divisores comuns entre 90 e 216 ?

Resoluçãao:

MDC (216 , 90) = 18

4) Divibilidade por 90 = { 1, 2, 3, 5, 6, 9, 18 } = 5
Divisibilidade por 216 = { 1, 2, 3, 4, 6, 9, 18} = 4

90 , 216 = { 1, 2, 3, 6, 9, 18 }

5) Calcule o maior número pelo qual dividindo 100 e 68 encontramos restos 10 e 8.

Resolução:

100 | X        
10    q1

68 | X
 8    q2

q1 . X + 10 = 100
q1 . X = 90

q2 . X + 8 = 68
q2 . X = 60

90 , 60 | 30, 30
3 , 2

Portanto: MDC (90 , 60) = 30

6) Qual o menor número que dividindo 15 e 18 deixa sempre o resto 12 ?

Resolução:

15, 18 | 2
15,   9 | 3
5,     3| 3
5,     1| 5
1,    1

2 . 32 = 90            X = 90 + 12 = 102


7) A diferença de idade entre 2 pessoas é de 15 anos e estão entre si 7 para 4.

Resolução:

X - Y = 15         7/4       (X - 4 ) / Y            15 / Y = (7 - 4) / 4         Y = 20

X - 20 = 15        
X = 15 + 20 = 35


17/01/2022

Comandos no SQL Server #2













--BULK INSERT: É usado no SQL server para copiar (importar) dados de um arquivo
texto ou nativo do SQL Server (também chamados de flat file)
É o modo mais rápido de se importar dodos; porém somente trabalha em uma direção e
com um tipo de arquivo: flat file.

--Exemplo de Bulk Insert
BULK INSERT produto FROM 'C:\SQLServer\scripts\Dados\produto.txt' 
   WITH CODEPAGE='ACP',
   DATA FILELETYPE = 'widechar', 
   filedterminator = '|', -- separando um do outro
   rowterminator = '\n', -- pula linha
   maxerrors = 0,          
   fire_triggers,           
   firestroe = 1,            -- importar a partir da primeira linha
   lastrow = 10             -- importar 10 linhas
)

________________________/ / ___________________________________

EXTENSÃO SQL: Permite a geração de 'scripts' poderosas e procedimentos
armazenados (scripts armazenados no servidor e que podem ser reutilizados).
Instruções de definição de dados CREATE VIEW, CREATE PROCEDURE, CREATE RULE,
CRIATE TRIGGER e CREATE DEFAULT dever ser cada uma a única instrução em um scripts

IF 1=1 AND 2 <> 2 BEGIN PRINT 'Correto é TRUE' 
  END ELSE
     PRINT 'Errado é falso'

DECLAARE @pedido INT, SET @pedido '10789';
  IF (SELECT Count(")
  FROM ped_detalhe WHERE pedido = @pedido
  GROUP BY pedido) > 3
     BEGIN 
        PRINT 'Condicao Satisfeita'
    END
    ELSE BEGIN
       PRINT 'Os Itens são' SELECT pedido, cod_mat
       FROM ped_detalhe
     END
_______________________ / /_______________________________

--Uso do WHILE no SQL Server

DECLARE @cont int
SET @CONT = 10
WHILE (SELECT GETDATE()- @cont) <= getdate()
    BEGIN
      PRINT GETDATE() -cont
        SET @cont = @cont -1
      IF (GETDATE() -@cont) >=GETDATE()
BREAK
      ELSE
  CONTINUE
END


--WHILE USANDO TABUADA
DECLARE @COUNT INT, @TAB INT
  SET @COUNT = 0
SET @TAB = 10

WHILE (@COUNT <= 10) BEGIN --enquanto cont < 10
   PRINT CAST (@COUNT as nvarchar) --imprimindo os valores
     + N' X' + --contatenando o valor X --
     CAST (@TAB as nvarchar) + N' = ' + CAST(@CONT * @TAB as nvarchar)
     CAST (@CONT * @TAB
  SET @CONT = @CONT +1
END

____________________________/ / ____________________

IF no SQL Server

--informe aqui o período para o qual deseja criar os dados
set @dataInicial = '01/01/2012'
set @dataFinal = '31/12/2030'

WHILE @dataInicial <= @dataFinal BEGIN
 set @data = @dataInicial
 set @ano = year(@data)
 set @mes = month(@data)
 set @dia = day(@data)
 set @diaSemana = datepart (weekday, @data)

if @diaSemana in (1,7)
 set @fimSemana = 'S'
else set @fimSemana = 'N'

/*Feriados locais/reginais e aqueles que não possuem data fixa
(carnaval, páscoa e corpus cristis) também devem ser adicionados aqui */

if(@mes = 1 and @dia =1) or (@mes = 12 and @dia =31)
 set @nomeFeriado = 'confraternização universal'
else
if (@mes = 4 and @dia =21)
 set @nomeFeriado = 'tiradentes'
 else
if (@mes = 5 and @dia =1) --dia do trabalho
 set @nomeFeriado = 'dia do trabalho'
else set @nomeFeriado = null

08/01/2022

Comandos no SQL Server #1

























Definição da Linguagem: Linguage Statmends
A linguagem SQL é dividida em 5 tipos de instruções de linguagem primária: DML, DDL, DCL, TCL

DML: Manipulação de linguagem de Dados, ou seja ão os que vai permitir manipular o banco de dados
DDL: Linguagem de Definição de Dados, são os comandos de criação de alteração de objetos dentro do banco de dados.
DSL: Linguagem de domínio específico, são os comandos para controlarmos os acessos dos usuários a base de dados ou tabela.
TCL: Linguagem de controle de transação, são as instruções que vai controlar as operações no banco de dados.

DML 
Select - recuperar dados 
Insert - inserir dados em uma tabela
Update - atualiza os dados existentes em uma tabela
Delete - exclui registros de uma tabela

DDL
Create - criar objetos no banco de dados, tabelas, indexes, procedures, views, functions,e tiggers
Alter - altera a estrutura da base de dados, tabelas, indexes, procedures, views, functions,e tiggers
Drop - apaga objeto do banco de dados, tabelas, indexes, procedures, views, functions,e tiggers
Truncate - remover todos os registros de uma tabela, tabelas, indexes, procedures, views, functions,e tiggers

DCL
Grante - atribui privilégios de acesso do usuário a objetos do banco de dados
Revoke - remove os privilégios de acesso aos objetos obtidos com o comando GRANT
Deny - nega permissão a um usuário ou grupo para realizar operação em um objeto ou recurso

TCL
Begin Transaction - Inicia uma transação
Commit -  salva o trabalho feito
Save Transaction - identificar um ponto em uma transação para que mais tarde você pode efetuar um ROLLBACK
Rollback - restaurar banco de dados ao original desde o último COMMIT




SELECT p.firstname,
p.lastname, 
e.vacationhours,
e.sickleavehours,
e.vacationhours + e.sickleavehours AS 'Horas Ausente'
FROM humanresources.employee AS e 
 JOIN person.person AS p 
 ON e businessentityid p businnessentityid
ORDER BY 'Horas Ausente' ASC


SELECT (2+5) -- retorna 7
SELECT (10%2) -- retorna 5


-- calcula a diferença de taxas de imposto
SELECT Max(taxrate) - Min(taxrate) AS 'Tax rate Difference' -- seleciona o maior e o menor valor
FROM sales salestaxrate
WHERE stateprovicenid IS NOT NULL


SELECT '1', 1 UNION SELECT 'A', 2 -- seleciona 2 colunas (1:A ; 1:2)


--seleciona tudo de city e ordena crescente por city
SELECT city FROM customers UNION ALL SELECT city
   FROM suppliers ORDER BY city




-- DDL CRIAÇÃO DA TABELA PARA EXERCICIOS
CREATE TABLE FUNCIONARIOS (
 ID int identy (1,1), -- campo do int com identificador (alto numeração)
 NOME VARCHAR(50) NOT NULL
 SALARIO DECIMAL(10,2) -- 2 casas decimais
 SETOR VARCHAR(30)
)

-- DML SELECT, EXEMPLO
SELECT *FROM funcionarios

SELECT nome, setor from funcionarios 

-- DML INSERT
INSERT INTO funcionarios VALUES ('Joao', 1000,''),
 ('Jose', 2000, '')

INSERT INTO funcionarios ('nome',salario), VALUES ('Pedro', 1000)-- insere 1 valor nulo na 3 coluna


--DML UPDATE
UPADATE funcionarios SET salario = '1500' WHERE id = '1' -- Altera o valor alterior para 1500

UPDATE funcionarios SET salario = salario * 1.5 WHERE id = '1' -- Altera e multiplica o salario pelo fator 1.5


--DML DELETE
DELETE funcionarios WHERE id = '1' -- exclui na tabela funcionarios onde 1 seja igual a 1



________________//_______________

Comandos DDL servem para gerar novas tabelas

--CREATE TABLE funcionario (
matricula INT IDENTITY (1,1), --inteiro, começa com 1 e acrescenta 1+1
nome CHAR(50) NOT NULL, -- 50 caracter e não pode ser nulo
data_nasc DATETIME -- só vai aceitar valor de data
)

--DDL GERANDO TABELA COM CHAVE ESTRANGEIRA
CREATE TABLE salario (
matricula INT PRIMARY KEY NOT NULL, --Não pode 2 vezes o mesmo número gravado na tabela
salario DECIMA (10, 2) NOT NULL,
FOREIGN KEY (matricula) REFERENCES funcionario(matricula)
)

--DDL PARA ADICIONAR CHAVE PRIMARIA
ALTER TABLE FUNCIONARIO ADD PRIMARY KEY (MATRICULA) 


--DDL GERANDO INDEX // índice para performação de consulta
CREATE INDEX ix_func1 ON funcionario(data_nasc)
CREATE INDEX ix_func2 ON funcionario(cidade, pais)


--Adicionando novo campo na tabela
ALTER TABLE funcionario  ADD genero  CHAR(1);
 
--Renomeando campo da tabela
EXEC sp_rename 'TABELA_ORIGEM.CAMPO_ORIG', 'Campo_orig', 'COLUMN'
EXEC Sp_rename 'funcionario.endereco', 'ender', 'COLUM' --'tabela que vai alterar . e o campo endereco' , 'para no nome x', 'tipo do objeto'


--Excluindo campo da tabela
ALTER TABLE funcionario DROP COLUMN genero; --exclui o campo genero

--Renomeando Tabela
EXEC sp_rename 'FUNCIONAIRO', 'FUNC'; -- renomeia de FUNCIONARIO para FUNC

--Excluindo tabela
DROP DATABASE CURSO;

--VISUALIZAÇÃO
CREATE VIEW v_funcionario AS SELECT *FROM FUNCIONARIOS


--Excluir um index
DROP index ix_func1 ON FUNCIONARIOS; --excluindo ix_func1 na tabela funcionarios

--Excluindo procedure
DROP PROCEDURE proc_salario;

--Excluindo função
DROP function func_salario;

--Excluindo Trigger
DROP trigger trig_func_salario;

--DDL TRUNCATE //VAI ELIMINAR TODOS OS DADOS DA TABELA, MAS A TABELA CONTINUARÁ DENTRO DO SISTEMA
TRUNCATE TABLE CIDADES; --os comandos anteriores serão eliminados

--Fazendo backup em tabela temporaria
SELECT *INTO #HJTEMP FROM person.Password -- person.password = nome da tabela


--ANALISE DE REGISTROS ANTES DO TRUNCATE
SELECT Count(*) AS AntesTruncateCount FROM person.Password;
go -- fará que ele siga para as instruções seguinte
--DDL TRUNCATE APAGADOS DADOS DA TABELA
TRUNCATE TABLE person.Password;
go
--VERIFICANDO TABELAS APOS TURNCATE
SELECT Count(*) AS DepoisTruncate FROM humanresources.jobcandidate;



______________________________/ /_________________________________

Comandos DCL (LINGUAGEM DE CONTROLE DE DADOS)

--GRANT, REVOKE e DENY: são comandos transact-sql usados para atribuir
--e negar permissões para acessos à objetos e recursos.

--CONCEDER (GRANT) - permite aos usuários ler / escrever em determinados objetos
de banco de daodos

--Cria um login e dá permissões no banco
exec master.dbo.sp_addlogin 'UsrTeste', 'SenhaTeste' --UsrTeste = usuário

--Concedendo Acesso de atualização para UsrTeste
GRANT UPDATE ON FUNCIONARIOS TO UsrTeste; -- Tabela 'FUNCIONARIOS' para o usuário UsrTeste

--Concedendo Acesso para INSERT usuário UsrTeste
GRANT INSERT ON FUNCIONARIOS TO UserTeste;

--Concedendo acesso de leitura para UsrTeste
GRANT SELECT ON FUNCIONARIOS TO UsrTeste;

--Concedendo acesso de DELETE PARA UsrTeste
GRANT DELETE ON FUNCIONARIOS TO UsrTeste;

--Concedendo acesso para EXECUTAR PROC TESTE_PROC para UsrTeste.
GRANT EXECUTE ON testproc TO UsrTeste;

--gerando uma procedure
CREATE PROCEDURE testproc as select *from cidades;

excutando procedure
EXEC testproc -- retorna o conteúdo da tabela cidades



--REVOGAR (REVOKE) - mantém os usuários de permissão de leitura / gravação em
objetos de banco de dados

--NEGAR (DENY) - Nega permissão a um usuário ou grupo para realizar operação
em um objeto ou recurso


--Verificando usuario logado
select CURRENT_USER

--ALTERANDO USUARIO LOGADO
SETUSER 'UsrTeste'

--inserindo dados
INSERT into FUNCIONARIOS values ('Maria', '1000', 'TI')

--UPDATE
UPDATE FUNCIONARIOS set nome='Marisa' where id='7'

--3° PARTE NEGA-DENY
--negando acesso de atualização UsrTeste
DENY UPDATE ON FUNCIONARIOS TO UsrTeste;

--NEGANDO ACESSO DE ATUALIZAÇÃO UsrTeste
DENY INSERT ON FUNCIONARIOS TO UsrTeste;

--NEGANDO ACESSO DE LEITURA UsrTeste
DENY SELECT ON FUNCIONARIOS TO UsrTeste;

--nega acesso a execução de procedure
DENY EXECUTE ON testtproc TO UsrTeste;

--VERIFICANDO USUARIO LOGADO
select CURRENT_USER

--Alterando usuario logado
SETUSER 'UsrTeste'

--EXECUTANDO PROCEDURE COM USUARIO UsrTeste
EXEC testproc


______________________/ / _______________________________

--TCL são usados para gerenciar as mudanças feitas por instruções
DML. Ele permite que as declarações sejam agrupadas em transações lógicas

BEGIN - Abre uma transação
COMMIT - Confirma/Salva uma transação
ROLLBACK = Rerter uma transação em caso de qualquer erro

--INICIA A TRANSAÇÃO
BEGIN TRANSACTION

--RETORNA A TABELA NO ESTADO ANTERIOR DO BEGIN TRANSACTION
ROLLBACK

--EFETIVA AS INFORMAÇÕES NA TABELA DO BD
COMMIT TRANSACTION --salva todas as informações 

--GERA UM PONTO DE RECUPERAÇÃO
SAVE TRANSACTION a3

--Restaura a tabela ate o ponto A2
ROLLBACK TRANSACTION a2


--Somente apresenta os clientes que fizeram compras antes da data atual
SELECT cli_cod
cli_nome
FROM clientes WHERE cli_cod IN (
SELECT cli_cod
FROM pedidos
WHERE ped_data <Getdate()


--Apresenta todos os clientes somente se qualquer cliente já fez algum pedido
SELECT cli_cod
cli_nome
FROM clientes WHERE cli_cod IN (
SELECT cli_cod
FROM pedidos


--Sub select
/*
P.num_ped = num_ped
P.data = data
P.cod_cli = cod_cliente
NOME_CLI */

SELECT P.num_ped, P.data, P.cod_cli,
(SELECT C.NOME_CLI FROM cliente C -- sub select para apresentar o nome do cliente
WHERE P.cod_cli = C.cod_cli) AS --onde o codigo do cliente seja = cod do cliente
NOME_CLI FROM pedidos AS P


--Trazer o total de cada cliente da tabela pedidos
P.cod_cli = cod_cli
NOME_CLI = NOME_CLI
(p.total) total = total



SELECT P.cod_cli,
(SELECT C.NOME_CLI FROM cliente C -- sub select para apresentar o nome do cliente
WHERE P.cod_cli = C.cod_cli) AS --onde o codigo do cliente seja = cod do cliente
NOME_CLI, Sum(p.total) total
FROM pedidos AS P GROUP BY P.cod_cli 


--GERANDO UMA CHAVE PRIMARIA COMPOSTA
ALTER TABLE MATRICULA ADD CONSTRAINT PK_1 PRIMARY KEY (ID_ALUNO, id_disciplina)

--ADICIONANDO CHAVE PRIMARIA TABELA DISCIPLINA
ALTER TABLE DISCIPLINA ADD CONSTRAINT PK_2 PRIMARY KEY(id_disciplina)

--Adicionando chave estrangeira na tabela matricula campo ID_ALUNO
ALTER TABLE MATRICULA ADD CONSTRAINT fk_mat1 FOREIGN KEY
(id_aluno) REFERENCES alunos(id_aluno)


_________________________/ / ____________________

INNER JOIN

--INNER JOIN
SELECT a.nome, c.nome_disc, b.periodo
FROM alunos a 
inner join matricula b
on a.id_aluno=b.id_aluno
inner join disciplina c
on b.id_disciplina=c.id_disciplina


________________________/ / ______________________

AGREGAÇÃO

--AGREGAÇÃO: São funções que executam um cálculo em um conjunto 
de valores e retornam um único valor


--AVG: Retorna a média dos valores em um grupo
--MIN: Retorna o mínimo na expressão
--MAX: Retorna o valor máximo na expressão
--SUM: Retorna a soma de todos os valores ou somente os valores
DISTINCT na expressão
--COUNT: Retorna o número de itens do grupo
--STEDV: Retorna o desvio padrão estatístico para a população de todos
os valores na expressão especificada
--GROUPING: Indica se uma expressão de coluna especificada em uma lista GROUPY BY
é agregada ou não.
--GROUPING_ID: É uma função que calcula o nível de agrupamento
--VAR: Retorna a variância estatistica de todos os valores da expressão especificada
--VARP: Retorna a variância estatística para o preenchimento de todos os valores
 da expressão especificada


--AVG Retorna a média dos valores em um grupo
SELECT AVG(populacao) FROM cidades

--AVG MEDIA POR ESTADO
SELECT UF, UF(POPULACAO) FROM CIDADES 
GROUP BY UF
ORDER BY 2

--AVG POR REGIÃO
SELECT B.regiao, AVG(a.POPULACAO) FROM CIDADES A
INNER JOIN regiao_uf 8
ON A.cod_uf=B.ID
GROUP BY B.regisao
ORDER BY 2 desc

--MIN 
SELECT MIN (populacao) from cidades 

--MIN POR ESTADO
SELECT UF, MIN(POPULACAO) FROM CIDADES
GROUP BY UF ORDER BY 2


--MIN POR REGIÃO
SELECT B.regiao, MIN(POPULACAO) FROM CIDADES A
  INNER JOIN regiao_uf B
  ON A.cod_uf=B.ID
  GROUP BY B.regiao
  ORDER BY 2

--MAX retorna o valor máximo na expressão
SELECT MAX(populacao) from cidadees

--MAX POR ESTADO
SELECT UF, MAX(POPULACAO) FROM CIDADES
GROUP BY UF
ORDER BY 2


SELECT B.regiao, MAX(a.POPULACAO) maximo FROM CIDADES a --a.POPULACAO= campo populacao
 INNER JOIN regiao_uf B
 ON A.cod_uf=B.ID
 GROUP BY B.regiao
 ORDER BY 2


/*As funções de classificação retornam um valor de classificação
para cada linha em uma partição. Dependendo da função usada, para
cada linha em uma partição.*/

SELECT rack() OVER (ORDER BY estado ASC) AS rack_uf,
 estado from uf

SELECT rack() OVER (ORDER BY estado ASC) AS rack_uf,
 regiao,
 estado from regiao_uf


--ROW NUMBER EM SQL
Retona o número sequencial de uma linha em uma partição de um 
conjunto de resultados iniciando em 1 para a primeira linha
de cada partição

SELECT ROW_NUMBER() OVER (ODER BY estado ASC) ROW_NUMBER_uf
regiao, estado, FROM regiao_uf

--FUNÇÕES LÓGICAS
--CHOOSE: Retorna o item ao índice espedifico de uma lista
de valores no SQL Server

SELECT Choose(1, 'Gerentee', 'Diretor', 'Desenvolvedor')AS Escolhido -- 1= posição

SELECT productcategoryid, Choose (productcateroyid, 'A', 'B', 'C') AS
Expressao FROM production.productcategory

SELECT jobtitle, hiredate,
Month(hiredate)mes,
Choose(Month(hiredate), 'Winter','Winter','Spring','Spring',
... ), As Quarter_hired
FROM humanresourses.employee 


--IIF: Retorna um de 2 valores 
DECLARE @a INT = 45,
@b INT = 40;
SELECT IIF (@a > @b, 'TRUE', 'FALSE') AS Resultado;

DECLARE @a INT = 45, @b INT = 40;
SELECT IIF (@a > @b, "Maior', "Menor') AS Resultado;

--FUNÇÕES MATEMÁTICAS
ABS: Uma função matemática que retorna o valor absoluto

SELECT Abs(-1.0),
Abs(0.0),
Abs(1.0),
Abs(-9);

RAND: Retorna um valor float pseudoaleatorio de 0 a 1

SELECT Rand();
SELECT Rand(), Rand(), Rand();

DECLARE @cont smallint;
SET @cont = 1;
WHILE @cont < 5 --enquanto contador for menor que 5
  BEGIN -- então faça
    SELECT RAND() Random_Number
    SET @cont = @cont + 1
  END;


ROUND: Retorna um valor numérico, arredondado.

SELECT Round(123.9994, 3), Round(123.9995);
SELECT Round(123.4545, 2); --precisão de 2 casas decimais
SELECT Round(123.45, -2); 

_____________/ / _____________________
--FUNÇÃO DE LIMITE
--TOP: É útil em grandes tabelas com milhares de registros

SELECT TOP 3 * FROM customers

_______________________ / /___________________________

--SRT: Retorna dados de caractere convertido em dados numéricos
SELECT Str(123.45, 6, 1);

--Conversao de numérico para caractere
SELECT 'Teste' +Str(123.45, 6, 1);

--CONCAT: Retorna uma cadeia de caracteres que retorna da concatenação
de 2 ou + valores

SELECT Concat (CURRENT_USER, 'Seu saldo é R$', 11.00, ' em',
  day(getdate()), '/', month(getdate()), '/', year(getdate())),
  AS resultado

--Substitui a cadeia de caracter cde em abcef...
SELECT REPLACE ('abcdefghicde', 'cde', 'xxx') para

SELECT REPLACE ('Isto é um teste' de,  'teste', 'producao') para;

SELECT REGIAO, REPLACE(REGIAO, 'sul', 'South') FROM regiao_uf

__________________/ / ____________

DATA E HORAS 

SELECT Sysdatetime() exSysdatetime
SELECT Sysdatetimeoffset() exSysdatetimeoffset
SELECT Syssutcdatetime() exSyssutcdatetime
SELECT CURRENT_TIMESTAMP exCURRENT_TIMESTAMP
SELECT Getdate() exGetdate
SELECT Getutcdate() exGetutcdate

--FUNÇÃO DE DATA E HORA PARTES QUE RETORNA O DIA/MES/ANO

SELECT Datename(day, Getdate()) DIA_N
  Datename(month, Getdate()) MES_N,
  Datename(year, Getdate()) ANO_N


--DATEADD: Retorna um novo valor datetime adicioando um intervalo
à datepart especificada da date especificada

SELECT Dateadd(day, 90, Getdate())

SELECT getdate() agora, Dateadd (day, 90, Getdate())-- adcionando 90 dias

SELECT getdate() agora, Dateadd(month, 2, Getdate()) -- adc 2 meses

SELECT getdate() agora, Dateadd(year, 3, Getdate())-- adc 3 anos


--DATEDIF: Retorna o número de limites de datepart de data ou
hora entre duas datas especificadas

--Diferença em dias
SELECT Datediff (day, '2022-03-12', '2017-07-13')

--Diferença em meses
SELECT Datediff (month, '2022-03-12', '2017-07-13')

--Diferença em anos
SELECT Datediff (year, '2022-03-12', '2017-07-13')

--FORMATANDO DATAS
SELECT convert(varchar(10), getdate(), 103)


____________________/ / ___________________________________

--USO DO CASE

DECLARE @data DATETIME
SET @data = getdate()-1
SELECT @data, CASE WHEN @data = Getdate() THEN 'Hoje'
SELECT CASE WHEN @data = Getdate() THEN 'Ontem'
SELECT CASE WHEN @data = Getdate() THEN 'Amanhã'
 END dia


USE AdventureWorks2014 SELECT 
  productnumber, productline,
  Categoria = CASE productline --nome da coluna: Categoria
  WHEN 'R' THEN 'Road'
  WHEN 'M' THEN 'Mountain'
  WHEN 'Not for sale' END, 
  NAME
FROM production.product
ORDER BY productnumber;


SELECT productnumber, NAME,
  CASE WHEN lisprice = 0 THEN 'Não está a venda'
  CASE WHEN lisprice < 50 THEN 'Abaixo de $50'
  CASE WHEN lisprice >= 0 AND listprice < 250 THEN 'Abaixo de $1000'
  ELSE 'Acima de $1000' END Price_Range, 'Produtos' AS Categoria
FROM production.product
ORDER BY productnumber


_________________________/ /_____________________________

--VIEWS: Pode ser definida como uma tabela virtual composta por linhas
e colunas de dados vindos de tabelas relacionadas em uma query

VANTAGENS: 
Reuso: Reutilização das views como objetos de caráter permanente
Segurança: As views permitem que ocultemos determinadas colunas de uma tabela
Simplificação do código: As views nos permitem criar um código de
programação muito mais limpo, na medida em que podem conter um SELECT complexo.


CREATE VIEW v_data_contratacao AS SELECT p.firstaname,
   p.lastname, e.businessentiyid, e.hiredate FROM
   humanresources.employee e JOIN person.person AS p
   ON e.businessentifyid = p.businessentiyid;


CREATE VIEW v_fornec_geral AS SELECT id_fornec, fornec FROM
   fornecedores1 UNION ALL
   SELECT id_fornect, fornec FROM fornecedores2 UNION ALL


_________________________ / / ____________________________________

--TEMP TABLE: Tabelas temporárias são geradas no database TempDB e 
podem ser classificadas como Locais e Globais:

* Tabelas Temporárias são geradas no prefixo "#" e possuem visibilidade para a conexão
responsável por sua criação; outas conexões não "enxergam" a tabela.
* Tabelas Temporárias Globais são geradas com o prefixo '##' e são visíveis por todas as conexões


--OPÇÃO DE DROP
- Uma tabela temporária (Local ou Global) só existe enquanto a conexão responsável
pela sua criação estiver ativa.

- No momento da desconexão, tabelas temporárias remanescentes serão dropadas automaticamente.

--GERANDO TABELA TEMPORÁRIA
CREATE TABLE #minhatemporaria (
  campo1 VARCHAR(80) NOT NULL,
  campo2 VARCHAR(80) NOT NULL)

--inserindo informações na tabela temporária
INSERT INTO #minhatemporaria VALUES ('Real', 1000)
INSERT INTO #minhatemporaria VALUES ('Dolar', 3000)


--Gerando tabela temporária através de um select
SELECT * INTO #minhatemporaria2 FROM #minhatemporaria

--Atualizando a tabela temporaria
UPDATE #minhatemporaria SET campo1= 'Libra' WHERE campo1= 'Real' 

--Deletando registros
DELETE FROM #minhatemporia

--Dropando a tabela temporaria
DROP TABELA #minhatemporaria






























31/12/2021

Contador 0 a 99 com PIC 16F877A

Código feito em CCS C Compiler

#include <16f877A.h>
#fuses HS, NOWDT, NOPROTECT, NOLVP
#use delay(crystal = 20 MHz)

int v1[] = {0b0111111, 0b0000110, 0b1011011, 0b1001111, 0b1100110, 0b1101101, 0b1111101, 0b0000111, 0b1111111, 0b1100111};

int v2[] = {0b0111111, 0b0000110, 0b1011011, 0b1001111, 0b1100110, 0b1101101, 0b1111101, 0b0000111, 0b1111111, 0b1100111};

int size = sizeof(v1)/sizeof(int);

void main(){
     
   while(true){
            
      for(int i = 0; i < size; i++){
         for(int j = 0; j <size; j++){
            output_b(v1[i]);
            output_c(v2[j]);
            delay_ms(500);
         }
      }
      
   }
}


Saída gerada no software Proteus versão 7.7






















Palavras chave:

Számláljon 0-tól 99-ig a PIC 16F877A segítségével
Лічыльнік ад 0 да 99 з PIC 16F877A
Հաշվիչ 0-ից 99 PIC 16F877A-ով
מונה 0 עד 99 עם PIC 16F877A
Teller 0 tot 99 met PIC 16F877A
Laskuri 0 - 99 PIC 16F877A:lla
Counter 0 ho 99 e nang le PIC 16F877A
PIC 16F877A ile 0'dan 99'a kadar Sayaç
Лічильник від 0 до 99 з PIC 16F877A
Tæller 0 til 99 med PIC 16F877A

16/12/2021

Catraca eletrônica

Trabalho 1 – Unidade II 2021/2 - MICROCONTROLADORES: construir uma fechadura eletrônica com o PICSimLab e programa de gerenciamento.

Descrição do funcionamento. 

O Usuário: Ao digitar uma senha correta de quatro dígitos os sistema apresentará uma mensagem de boas-vindas no LCD, ligará um LED e aciona um Relé simulando a abertura da catraca ou porta. Se a senha não for uma senha cadastrada o sistema apresenta uma mensagem informando para o usuário procurar a secretaria para resolver a pendência, acende outro LED e não aciona o relé. O 

Administrador: Ao digitar a senha de administrador o sistema apresenta um menu no LCD para que o mesmo possa dar manutenção no sistema. A manutenção consiste de poder incluir, deletar e buscar um cadastro de usuário. Também deve ser possível enviar e receber e receber para um programa, o banco com todos os cadastros de usuários. No programa deve ser possível fazer a manutenção do banco. Recomenda-se usar o “banco de dados” SqLite. Obs:. sistema é totalmente controlado pelo microcontrolador 16F877A e desenvolvido para o PicSimLab. A senha é armazenada no EPROM, 24C04, presente na placa. Segue o Link de um projeto desenvolvido por alunos de turmas anteriores

Obs:. sistema é totalmente controlado pelo microcontrolador 16F877A e desenvolvido para o PicSimLab. A senha é armazenada no EPROM, 24C04, presente na placa. Segue o Link de um projeto desenvolvido por alunos de turmas anteriores























O Vídeo do projeto: https://youtu.be/s_2AreNMFAM

Resolução:


Clique aqui para fazer o download do projeto

Créditos para: Danubia e André

15/12/2021

Escrever dados e salvar em Java

Objetivo: Escrever informações em um arquivo qualquer.

Classe: EscreverPalavras.java


import java.io.FileOutputStream;
import java.io.PrintWriter;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author HENRIQUE
 */
public class EscreverPalavras {
    public void escreve(Object texto){
        try {
            FileOutputStream arq = new FileOutputStream("arquivo.asm");
            PrintWriter tk = new PrintWriter(arq);
            
            tk.print(texto);
            tk.close();
        } catch (Exception e) {
            System.out.println("ERRO !"+e.getMessage());
        }
    }
}

Arquivo: Main.java

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author HENRIQUE
 */
public class Main {
    public static void main(String[] args) {
        EscreverPalavras es = new EscreverPalavras();
        es.escreve("Wello World!");
        
    }
}

Saída gerada no simulador: https://www.onlinegdb.com/









Código no simulador:


Palavras chave:

Write data and save in Java
כתוב נתונים ושמור ב-Java
ډاټا ولیکئ او په جاوا کې خوندي کړئ
Nulis data lan simpen ing Jawa
在Java中寫入數據並保存
Записать данные и сохранить на Java
Java дээр өгөгдөл бичиж хадгална
Skriv data och spara i Java
Napišite podatke i sačuvajte u Javi
Tulis data sareng simpen dina Java
Գրեք տվյալները և պահպանեք Java-ում
Запісвайце дадзеныя і захоўвайце іх у Java
Írjon adatokat és mentse el Java-ban

Catraca eletrônica no PicSimLab

Trabalho 1 – Unidade II 2021/1 - MICROCONTROLADORES: construir uma fechadura eletrônica com o PICSimLab e programa de gerenciamento.

Descrição do funcionamento. 

O Usuário: Ao digitar uma senha correta de quatro dígitos os sistema apresentará uma mensagem de boas-vindas no LCD, ligará um LED e aciona um Relé simulando a abertura da catraca ou porta. Se a senha não for uma senha cadastrada o sistema apresenta uma mensagem informando para o usuário procurar a secretaria para resolver a pendência, acende outro LED e não aciona o relé. O 

Administrador: Ao digitar a senha de administrador o sistema apresenta um menu no LCD para que o mesmo possa dar manutenção no sistema. A manutenção consiste de poder incluir, deletar e buscar um cadastro de usuário. Também deve ser possível enviar e receber e receber para um programa, o banco com todos os cadastros de usuários. No programa deve ser possível fazer a manutenção do banco. Recomenda-se usar o “banco de dados” SqLite. Obs:. sistema é totalmente controlado pelo microcontrolador 16F877A e desenvolvido para o PicSimLab. A senha é armazenada no EPROM, 24C04, presente na placa. Segue o Link de um projeto desenvolvido por alunos de turmas anteriores

Obs:. sistema é totalmente controlado pelo microcontrolador 16F877A e desenvolvido para o PicSimLab. A senha é armazenada no EPROM, 24C04, presente na placa. Segue o Link de um projeto desenvolvido por alunos de turmas anteriores
























O Vídeo do projeto: https://youtu.be/s_2AreNMFAM


Resolução:


Clique aqui para fazer o download do projeto

Créditos para: Afonso e Daniel

13/12/2021

Controlador PID de Temperatura — PICSimLab

Trabalho 3 – Unidade II 2021/2 - MICROCONTROLADORES : construir um sistema de controle de temperatura em malha fechada com o módulo de temperatura do PICSimLab.
Descrição do funcionamento. O sinal de entrada deve ser ajustado no PICSimLab no potenciômetro P1. O PIC recebe o sinal de entrada e a temperatura via AD, calcula o erro entre o valor da temperatura de referência (entrada) e a saída da planta (temperatura lida pelo sensor na planta – LM35), processa com modelo do controlador e gera um sinal de controle (ton do PWM) que deve ser aplicado no atuador(resistor). Um sinal de distúrbio também poderá ser aplicado a planta via potenciômetro P2. Os sinais de entrada, saída, distúrbio, controle (ton) e o erro devem ser enviado ao Processing (ou outra interface desenvolvido pelo aluno) onde são apresentado na forma de gráficos de linha:


















Funções
    1. O operador
Poderá modificar o sinal de referência ou temperatura desejada via potenciômetro P1.
Poderá inserir um distúrbio no sistema através do mini ventilador (cooler). Esse distúrbio também deve ter a intensidade controlada via potenciômetro P2.
Características gerais

1. O conversor AD deve ser configurado em 10bits para aumentar a precisão.
2. Devem ser utilizados PWM para acionamento do resistor (atuador) e do cooler (distúrbio).
3. Deve ser utilizado o LM32 (sensor de temperatura) da placa para obter a temperatura de saída
4. Os gráficos devem ter indicações nos eixos.
5. Deve ser realizado o experimento em malha aberta para determinar os parâmetros P, I e D do controlador PID. Usar a metodologia de Ziegler-Nichols apresentada em sala de aula.
6. A comunicação entre o PICSimLab e o Processing deve ser via porta serial virtual.


Resolução:



























Clique aqui para fazer o download do projeto

Créditos para: Afonso

12/12/2021

Controle de temperatura em malha fechada

Trabalho 3 – Unidade II 2021/2 - MICROCONTROLADORES : construir um sistema de controle de temperatura em malha fechada com o módulo de temperatura do PICSimLab.
Descrição do funcionamento. O sinal de entrada deve ser ajustado no PICSimLab no potenciômetro P1. O PIC recebe o sinal de entrada e a temperatura via AD, calcula o erro entre o valor da temperatura de referência (entrada) e a saída da planta (temperatura lida pelo sensor na planta – LM35), processa com modelo do controlador e gera um sinal de controle (ton do PWM) que deve ser aplicado no atuador(resistor). Um sinal de distúrbio também poderá ser aplicado a planta via potenciômetro P2. Os sinais de entrada, saída, distúrbio, controle (ton) e o erro devem ser enviado ao Processing (ou outra interface desenvolvido pelo aluno) onde são apresentado na forma de gráficos de linha:




















Funções
    1. O operador
Poderá modificar o sinal de referência ou temperatura desejada via potenciômetro P1.
Poderá inserir um distúrbio no sistema através do mini ventilador (cooler). Esse distúrbio também deve ter a intensidade controlada via potenciômetro P2.
Características gerais

1. O conversor AD deve ser configurado em 10bits para aumentar a precisão.
2. Devem ser utilizados PWM para acionamento do resistor (atuador) e do cooler (distúrbio).
3. Deve ser utilizado o LM32 (sensor de temperatura) da placa para obter a temperatura de saída
4. Os gráficos devem ter indicações nos eixos.
5. Deve ser realizado o experimento em malha aberta para determinar os parâmetros P, I e D do controlador PID. Usar a metodologia de Ziegler-Nichols apresentada em sala de aula.
6. A comunicação entre o PICSimLab e o Processing deve ser via porta serial virtual.


Resolução:




























Clique aqui para fazer o download do arquivo completo

Créditos para: Igor

Palavras chave:

Closed loop temperature control
Temperaturkontroll med sluten slinga
Temperaturkontroll i lukket sløyfe
Kontrola temperatury w pętli zamkniętej
Kontrola temperature zatvorenog kruga
Suljetun piirin lämpötilan säätö
Регулювання температури в замкнутому циклі
בקרת טמפרטורה בלולאה סגורה

11/12/2021

Controle de Temperatura no PicSimlab


Trabalho 3 – Unidade II 2021/2 - MICROCONTROLADORES : construir um sistema de controle de temperatura em malha fechada com o módulo de temperatura do PICSimLab.
Descrição do funcionamento. O sinal de entrada deve ser ajustado no PICSimLab no potenciômetro P1. O PIC recebe o sinal de entrada e a temperatura via AD, calcula o erro entre o valor da temperatura de referência (entrada) e a saída da planta (temperatura lida pelo sensor na planta – LM35), processa com modelo do controlador e gera um sinal de controle (ton do PWM) que deve ser aplicado no atuador(resistor). Um sinal de distúrbio também poderá ser aplicado a planta via potenciômetro P2. Os sinais de entrada, saída, distúrbio, controle (ton) e o erro devem ser enviado ao Processing (ou outra interface desenvolvido pelo aluno) onde são apresentado na forma de gráficos de linha:
















Funções
    1. O operador
Poderá modificar o sinal de referência ou temperatura desejada via potenciômetro P1.
Poderá inserir um distúrbio no sistema através do mini ventilador (cooler). Esse distúrbio também deve ter a intensidade controlada via potenciômetro P2.
Características gerais

1. O conversor AD deve ser configurado em 10bits para aumentar a precisão.
2. Devem ser utilizados PWM para acionamento do resistor (atuador) e do cooler (distúrbio).
3. Deve ser utilizado o LM32 (sensor de temperatura) da placa para obter a temperatura de saída
4. Os gráficos devem ter indicações nos eixos.
5. Deve ser realizado o experimento em malha aberta para determinar os parâmetros P, I e D do controlador PID. Usar a metodologia de Ziegler-Nichols apresentada em sala de aula.
6. A comunicação entre o PICSimLab e o Processing deve ser via porta serial virtual.

Resolução:

Código feito em CCS C Compiler

Arquivo temp.c


#include <temp.h>
#include "biblioteca\mod_lcd.c"


char grau = 223;                           //  Pega o simbolo "º", grau

float temperatura_Atual = 0.0,
      temperatura_Antiga = 0.0,
      Disturbio = 0;
      
double ref,                                // Referencia desejada
       error,                              // Diferenca entre temperatura desejada e temperatura atual
       kP = 70,
       kI = 2,
       kD = 0,
       P, I, D,
       pid;
      
       
       
       
double process(){
// Implementação PID
//Proporcional
P = error * kP;
//Integrador
I = I + (error * kI);
//Derivador
D = (temperatura_Antiga - temperatura_Atual) * kD;
temperatura_Antiga = temperatura_Atual;
// Soma tudo
pid = P + I + D;

return pid;
}

void main(){

   setup_adc(ADC_CLOCK_DIV_16);                       // ADC Module uses its internal oscillator
   setup_adc_ports(AN0_AN1_AN2_AN3_AN4);              // Configuracao de portas analogicas
   
   enable_interrupts(INT_RTCC);
   enable_interrupts(GLOBAL);

   setup_timer_2(T2_DIV_BY_16,255,1);      //819 us overflow, 819 us interrupt 255+1 = 256 *4 = 1024

   setup_ccp1(CCP_PWM);                    // Configura a porta CCP1 como PWM
   setup_ccp2(CCP_PWM);                    // Configura a porta CCP2 como PWM
      
   lcd_ini();        // Inicializa LCD
   delay_ms(10);

  
   while(TRUE) {

      set_adc_channel(0);                                    // Seleciona o canal ANA0
      delay_ms(10);                                          // Tempo para ativacao
      ref = read_adc() * 0.0489 + 20;                        // Pega a leitura do ANA0
      
      set_adc_channel(2);
      delay_ms(10);
      temperatura_Atual = ((read_adc() * 5)/1023.0)/0.010;
      if (temperatura_Atual >=1) {
      
      error = ref - temperatura_Atual;

      process();

      if(pid>1023) { pid=1023; } else if (pid<=0) { pid=0; }
      if (error >0) { set_pwm2_duty((int16)pid); }
      
      else if (error <=0) { set_pwm2_duty(0); }
           
      set_adc_channel(1);
      delay_ms(10);
      disturbio = read_adc();

      SET_PWM1_DUTY((int16) disturbio);    
                                                                            // Escreve na Tela
      printf (lcd_escreve,"\fTemp= %f %cC",temperatura_Atual, grau);        // Temperatura
      printf (lcd_escreve,"\n\rRef= %f %cC",ref, grau);                     // Referencia
      delay_ms(1000);
      
      
      }
   } // While

} // Main

_______________________//___________________

Arquivo mod_lcd.c

// As defininições es a seguir s�o utilizadas para acesso aos pinos do display
// caso o pino RW n�o seja utilizado, comente a defini��o lcd_rw
#ifndef lcd_enable
   #define lcd_enable       pin_e1      // pino enable do LCD
   #define lcd_rs         pin_e0      // pino rs do LCD
   //#define lcd_rw      pin_e2      // pino rw do LCD
   #define lcd_d4         pin_d4      // pino de dados d4 do LCD
   #define lcd_d5         pin_d5      // pino de dados d5 do LCD
   #define lcd_d6         pin_d6      // pino de dados d6 do LCD
   #define lcd_d7         pin_d7      // pino de dados d7 do LCD
#endif

#define lcd_type 2           // 0=5x7, 1=5x10, 2=2 linhas
#define lcd_seg_lin 0x40    // Endere�o da segunda linha na RAM do LCD

// a constante abaixo define a seq��ncia de inicializa��o do m�dulo LCD
byte CONST INI_LCD[4] = {0x20 | (lcd_type << 2), 0xf, 1, 6};

byte lcd_le_byte()
// l� um byte do LCD (somente com pino RW)
{
   byte dado;
   // configura os pinos de dados como entradas
   input(lcd_d4);
   input(lcd_d5);
   input(lcd_d6);
   input(lcd_d7);
   // se o pino rw for utilizado, coloca em 1
   #ifdef lcd_rw
      output_high(lcd_rw);
   #endif
   output_high(lcd_enable); // habilita display
   dado = 0;   // zera a vari�vel de leitura
   // l� os quatro bits mais significativos
   if (input(lcd_d7)) bit_set(dado,7);
   if (input(lcd_d6)) bit_set(dado,6);
   if (input(lcd_d5)) bit_set(dado,5);
   if (input(lcd_d4)) bit_set(dado,4);
   // d� um pulso na linha enable
   output_low(lcd_enable);
   output_high(lcd_enable);
   // l� os quatro bits menos significativos
   if (input(lcd_d7)) bit_set(dado,3);
   if (input(lcd_d6)) bit_set(dado,2);
   if (input(lcd_d5)) bit_set(dado,1);
   if (input(lcd_d4)) bit_set(dado,0);
   output_low(lcd_enable);   // desabilita o display
   return dado;   // retorna o byte lido
}

void lcd_envia_nibble( byte dado )
// envia um dado de quatro bits para o display
{
   // coloca os quatro bits nas saidas
   output_bit(lcd_d4,bit_test(dado,0));
   output_bit(lcd_d5,bit_test(dado,1));
   output_bit(lcd_d6,bit_test(dado,2));
   output_bit(lcd_d7,bit_test(dado,3));
   // d� um pulso na linha enable
   output_high(lcd_enable);
   output_low(lcd_enable);
}


void lcd_envia_byte( boolean endereco, byte dado )
{
   // coloca a linha rs em 0
   output_low(lcd_rs);
   // aguarda o display ficar desocupado
   //while ( bit_test(lcd_le_byte(),7) ) ;
   // configura a linha rs dependendo do modo selecionado
   output_bit(lcd_rs,endereco);
   delay_us(100);   // aguarda 100 us
   // caso a linha rw esteja definida, coloca em 0
   #ifdef lcd_rw
      output_low(lcd_rw);
   #endif
   // desativa linha enable
   output_low(lcd_enable);
   // envia a primeira parte do byte
   lcd_envia_nibble(dado >> 4);
   // envia a segunda parte do byte
   lcd_envia_nibble(dado & 0x0f);
}


void lcd_ini()
// rotina de inicializa��o do display
{
   byte conta;
   output_low(lcd_d4);
   output_low(lcd_d5);
   output_low(lcd_d6);
   output_low(lcd_d7);
   output_low(lcd_rs);
   #ifdef lcd_rw
      output_high(lcd_rw);
   #endif
   output_low(lcd_enable);
   delay_ms(15);
   // envia uma seq��ncia de 3 vezes 0x03
   // e depois 0x02 para configurar o m�dulo
   // para modo de 4 bits
   for(conta=1;conta<=3;++conta)
   {
      lcd_envia_nibble(3);
      delay_ms(5);
   }
   lcd_envia_nibble(2);
   // envia string de inicializa��o do display
   for(conta=0;conta<=3;++conta) lcd_envia_byte(0,INI_LCD[conta]);
}

void lcd_pos_xy( byte x, byte y)
{
   byte endereco;
   if(y!=1)
      endereco = lcd_seg_lin;
   else
      endereco = 0;
   endereco += x-1;
   lcd_envia_byte(0,0x80|endereco);
}

void lcd_escreve( char c)
// envia caractere para o display
{
   switch (c)
   {
     case '\f'    :   lcd_envia_byte(0,1);
              delay_ms(2);
            break;
     case '\n'   :
     case '\r'    :   lcd_pos_xy(1,2);
              break;
     case '\b'    :   lcd_envia_byte(0,0x10);
              break;
     default   :   lcd_envia_byte(1,c);
              break;
   }
}

char lcd_le( byte x, byte y)
// le caractere do display
{
   char valor;
   // seleciona a posi��o do caractere
   lcd_pos_xy(x,y);
   // ativa rs
   output_high(lcd_rs);
   // l� o caractere
   valor = lcd_le_byte();
   // desativa rs
   output_low(lcd_rs);
   // retorna o valor do caractere
   return valor;
}

Saída ggerada no PicSimlab

























Clique aqui para fazer o download o Projeto Completo

Créditos para: Fábio Pereira