台达plc怎么做485通讯程序谢谢!

台达plc怎么做485通讯程序谢谢!,第1张

台达PLC本身就有自带的485通讯口,因此不需要另外再做485通讯程序

台达PLC采用可以编制程序的存储器,用来在其内部存储执行逻辑运算、顺序运算、计时、计数和算术运算等 *** 作的指令,并能通过数字式或模拟式的输入和输出,控制各种类型的机械或生产过程。

台达PLC除了具有快速执行程序运算、丰富指令集、多元扩展功能卡及高性价比等特色外,并且支持多种通讯协议,使工业自动控制系统联成一个整体。

PLC品种齐全的各种硬件装置,可以组成能满足各种要求的控制系统,用户不必自己再设计和制作硬件装置。不必改变PLC的硬设备,只需改编程序就可以满足要求。

扩展资料:

台达PLC的优点:

1、功能强,适应面广

现代PLC不仅有逻辑运算、计时、计数、顺序控制等功能,还具有数字和模拟量的输入输出、功率驱动、通信、人机对话、自检、记录显示等功能。既可控制一台生产机械、一条生产线,又可控制一个生产过程。

2、编程简单,容易掌握

大多数PLC仍采用继电控制形式的“梯形图编程方式”。既继承了传统控制线路的清晰直观,又考虑到大多数工厂企业电气技术人员的读图习惯及编程水平,所以非常容易接受和掌握。

3、减少了控制系统的设计及施工的工作量

由于PLC采用了软件来取代继电器控制系统中大量的中间继电器、时间继电器、计数器等器件,控制柜的设计安装接线工作量大为减少。

参考资料来源:百度百科—台达PLC

/

MEGA8_485_EEPROM_817_ADC_WDTc

Created: 2013-8-8 16:52:15

Author: Administrator

/

#define F_CPU 4000000UL

#include <avr/ioh>

#include <util/delayh>

#include <avr/interrupth>

#include <stringh>

#include <avr/wdth> //看门狗相关头文件

#include <avr/eepromh>

#define INT8U unsigned char

#define INT16U unsigned int

#define INT32U unsigned long

#define BT_NO 0xDE //电池的识别号码

INT8U eepromx EEMEM;

//全局变量

INT16U ADC_bt_v;

INT8U UART_Send_flag;

INT8U ADC_Buffer[]={0,0,0,0};

static INT32U ADC_bt_Total=0;

INT16U ADC_bt_S;

INT16U ADC_Ref_Buffer[]={0,0};

float ADC_Ref;

INT16U n;

//串口初始化

void Usart_Init(INT16U BAUD)

{

UCSRB =_BV(RXEN)|_BV(TXEN)|_BV(RXCIE); //接收与发送使能,接收与接收结束中断使能

UCSRC=_BV(UCSZ1)|_BV(UCSZ0)|_BV(UPM1)|_BV(URSEL); //8位数据位、1位停止位、偶校验

UBRRL=(F_CPU/BAUD/16-1)%256; //设置波特率

UBRRH=(F_CPU/BAUD/16-1)/256;

}

//单字符发送

void Send_Char(char c)

{

while(!(UCSRA&_BV(UDRE))); //判断数据寄存器是否为空

UDR=c;

while(!(UCSRA&_BV(TXC))); //判断发送是否结束

UCSRA|=_BV(TXC); //通过置位进行手动清零

}

//串口接收部分

//#define RX_BUFFER_SIZE 2

//uchar rx_buffer[RX_BUFFER_SIZE];

//uchar rx_counter;

//uchar Uart_RecvFlag;

//系统初始化

void System_Init()

{

ADCSRA=0xE6; //10位ADC转换置位,启动转换,64分频

DDRB|=_BV(PB0); //485的收发模式控制端口,低电平为接收模式,高电平为发送模式

PORTB&=~_BV(PB0);

DDRC&=~_BV(PC0); //ADC0引脚定义

PORTC&=~_BV(PC0);

TCCR1B=0x03; //T1预设分频:256

TCNT1=65536-F_CPU/64015; //晶振4MHZ,15S定时初值

TIMSK=0x04; //允许T1定时器溢出中断

wdt_enable(WDTO_2S); //启动看门狗(溢出时间19S,约等于20S)

/ WDTCSR=0x0F;/

DDRD&=~_BV(PD2); //INT0中断引脚定义

PORTD|=_BV(PD2);

MCUCR=0x00; //INT0中断低电平触发

GICR=0XC0; //INT0中断使能

DDRD&=~_BV(PD3); //INT1中断引脚定义

PORTD|=_BV(PD3);

// EICRA=0x00; //INT1中断低电平触发

eeprom_busy_wait();

ADC_Ref_Buffer[0]=(INT16U)eeprom_read_byte(1);

eeprom_busy_wait();

ADC_Ref_Buffer[1]=(INT16U)eeprom_read_byte(2);

ADC_Ref=(float)(ADC_Ref_Buffer[0]1000+ADC_Ref_Buffer[1]);

DDRC|=_BV(PC4); //测试引脚

PORTC|=_BV(PC4);

sei(); //开总中断

}

//------------------------------------------------------------

//对通道CH进行模数转换

//------------------------------------------------------------

INT16U ADC_Convert(void)

{

INT16U Result;

ADMUX=0xC0; //ADC0通道,使用内部参考电压11V

Result=(INT16U)((ADCL+(ADCH<<8))ADC_Ref/10240830/680+ADC_Ref);

return Result;

}

INT16U ADC_T()

{

INT16U ADC_bt;

ADC_bt=ADC_Convert();

ADCSRA=0xE6;

_delay_us(500); //延时后重新再读取ADC,关键点

ADC_bt=ADC_Convert();

ADCSRA=0xE6;

return ADC_bt;

}

int main(void)

{

Usart_Init(9600);

System_Init();

_delay_ms(1000);

while(1)

{

_delay_ms(10);

}

}

//--------------------------

//外部中断1中断函数

//--------------------------

ISR(INT1_vect)

{

PORTC&=~_BV(PC4);

TIMSK=0X00;

}

//--------------------------

//INT0中断函数,用来校正参考电压

//--------------------------

ISR(INT0_vect)

{

//校正参考电压,要用标准2200V电压来校正

INT16U ADC_C;

ADCSRA=0xE6; //10位ADC转换置位,启动转换,64分频

ADMUX=0xC0; //ADC0通道,使用内部参考电压11V

ADC_C=(INT16U)(ADCL+(ADCH<<8));

ADC_Ref=40350/(ADC_C/10240830/680+1); //要用标准2200V来校正,精度要尽量高

ADC_Ref_Buffer[0]=ADC_Ref/100;

ADC_Ref_Buffer[1]=(INT16U)ADC_Ref%100;

eeprom_busy_wait();

eeprom_write_byte(1,ADC_Ref_Buffer[0]);

eeprom_busy_wait();

eeprom_write_byte(2,ADC_Ref_Buffer[1]);

}

//-------------------------------

//定时器1中断程序负责喂狗(19S以内)

//-------------------------------

ISR(TIMER1_OVF_vect)

{

TCNT1=65536-F_CPU/64015; //重装初值

wdt_reset(); //看门狗复位

}

//USART串口通信接收中断函数

ISR(USART_RXC_vect)

{

INT8U data;

data=UDR;

sei(); //开总中断,实现中断嵌套

UCSRB&=~_BV(RXCIE);

switch (data)

{

case BT_NO:

for (INT8U n;n<8;n++)

{

ADC_bt_S=ADC_T();

ADC_bt_Total=(INT32U)(ADC_bt_Total+ADC_bt_S);

}

ADC_bt_v=(INT16U)(ADC_bt_Total/80);

ADC_bt_Total=0;

ADC_Buffer[0]=ADC_bt_v/1000;

ADC_Buffer[1]=ADC_bt_v/100%10;

ADC_Buffer[2]=ADC_bt_v/10%10;

ADC_Buffer[3]=ADC_bt_v%10;

PORTB|=_BV(PB0);

_delay_ms(1);

Send_Char(BT_NO); //表明哪个电池分送的信号

_delay_ms(1);

PORTB&=~_BV(PB0);

PORTB|=_BV(PB0);

_delay_ms(1);

Send_Char(ADC_Ref_Buffer[0]); //MCU参考电压高位

_delay_ms(1);

PORTB&=~_BV(PB0);

PORTB|=_BV(PB0);

_delay_ms(1);

Send_Char(ADC_Ref_Buffer[1]); //MCU参考电压低位

_delay_ms(1);

PORTB&=~_BV(PB0);

for (INT8U i=0;i<4;i++)

{

PORTB|=_BV(PB0);

_delay_ms(1);

Send_Char(ADC_Buffer[i]);

_delay_ms(1);

PORTB&=~_BV(PB0);

}

break;

}

UCSRB|=_BV(RXCIE);

}

这个问题很简单,用485通讯的话,思路如下

思路:

PC方面:可以用MSCOMM控件先发一个字符表示接收地址,后延迟1ms,(注意PC端在485通讯在字符发送过程中一定要加延迟,这是我多次测试的总结,如果是用调试助手的话,他内部代码已经加过延迟了,就不必考虑这个问题)再发控制指令,初学者建议直接用调试助手

单片机方面:首先对接收数据进行核对,如果不是本地地址,放弃,如果是本地地址,在检测命令是否正确,如果正确,做出处理后返回PC本地地址并发送命令

我举个例子教你怎么玩多站通讯,下面是我已经通过测试的一个程序

#include <reg51h> //选用晶振110592MHz

#include <absacch>

#define DATA51 DBYTE[0x80] //80H存数据

#define AddressID 0x31 //本机地址1

sbit RS485E=P3^7; //定义485的使能脚// RS5485E=0为接收状态 RS5485E=1为发送状态

sbit MAX485_DIR=P3^7;

main()

{

//通讯设置

SCON = 0xF0; //REN=1允许串行接受状态,串口工作模式3,SM2=1

TMOD|= 0x20; //定时器工作方式2

PCON|= 0x80; //波特率提高一倍

IP=0x10; //串口优先级高

// TH1 = 0xFD; //baud2 / reload value 19200、数据位8、停止位1。效验位无(110592)

TH1 = 0xf4; //fa // //baud2 / 波特率4800、数据位8、停止位1。效验位无 (110592M)

TL1 = 0xf4;

TR1 = 1; //开启定时器1

EA = 1; // 开总中断

ES = 1; //开串口中断

RS485E=0; // RS5485E=0为接收状态 RS5485E=1为发送状态

while(1);

}

void counter4(void) interrupt 4 using 2 //串口中断

{

while(RI==0);

RI=0;

if(SBUF==AddressID)

{

while(RI==0);

RI=0;

if(SBUF==0x01) //发送指令

{

MAX485_DIR=1; //开发送

SBUF=AddressID;

while(TI==0);

TI=0;

SBUF=0x6f; //发送o

while(TI==0);

TI=0;

SBUF=0x6b; //发送k

MAX485_DIR=0; //开接收

}

if(SBUF==0x00) //接收

{

//这里怎么处理就看你自己要怎么做了,你没要求,我也不好怎么写,就自己写吧

}

}

}

程序调试通过,可以直接套用

1、台达PLC和变频器中,使用的应用通讯协议是MODBUS,硬件层用485;

2、485连接的时候,需要先把变频器和PLC的通讯波特率,奇偶校验,结束位等做好匹配,其中变频器要设置站号;

3、在PLC中编程,使用MODRW指令,具体使用方式,如果有台达编程手册,就详细读一读这个指令的应用吧;

4、参考变频器手册的通讯章节,有个MODBUS地址,其中的启动,停止地址是2000H,对应的是数据的bit5~6,频率地址是2001H。

扩展资料:

硬件措施:

主要模块均采用大规模或超大规模集成电路,大量开关动作由无触点的电子存储器完成,I/O系统设计有完善的通道保护和信号调理电路。

①屏蔽——对电源变压器、CPU、编程器等主要部件,采用导电、导磁良好的材料进行屏蔽,以防外界干扰。

②滤波——对供电系统及输入线路采用多种形式的滤波,如LC或π型滤波网络,以消除或抑制高频干扰,也削弱了各种模块之间的相互影响。

③ 电源调整与保护——对微处理器这个核心部件所需的+5V电源,采用多级滤波,并用集成电压调整器进行调整,以适应交流电网的波动和过电压、欠电压的影响。

④ 隔离——在微处理器与I/O电路之间,采用光电隔离措施,有效地隔离I/O接口与CPU之间电的联系,减少故障和误动作;各I/O口之间亦彼此隔离。

参考资料来源:百度百科-台达PLC

以上就是关于台达plc怎么做485通讯程序谢谢!全部的内容,包括:台达plc怎么做485通讯程序谢谢!、您好,有没有关于单片机RS485多机通信的c语言程序啊、基于RS485总线的PC与多个单片机通信的C语言程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9849725.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存