4.18

#include <stdio.h>
#include <stdlib.h>
#include <error.h>
#include <fcntl.h>
#include <sys/stat.h>


/*Internet*/
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/un.h>
#include <netinet/in.h>
/*Pthread*/
#include <pthread.h>


#define PORT 8888
#define ERR(m)\
do{\
perror(m);\
exit(EXIT_FAILURE);\
}while(0)




struct online{
int clientfd;
char name[20];
char password[20];


struct online *next;
};




struct message{
int action;
char name[20];
char password[10];
char toname[20];
char msg[1024];
};


enum action{
REGIN = 1,
REGSUC,
REGFAIL,
LOGIN,
LOGSUC,
LOGFAIL,
FINDNAME,
FINDSUC,
FINDFAIL,
CHATOUT,
CHATIN,
SENDALL,
NOOTHER,
DISALL,
DISALLSUC,
};




typedef struct online Online;
typedef struct online * Link;




void create_link(Link *head);
void create_newnode(Link *newnode);
void is_malloc_ok(Link *newnode);
void insert_node(Link newnode);
void * read_msg(void *arg);
int is_login(struct message msg);
int findname(struct message msg);
void chat(struct message msg);
void sendall(struct message msg);
void displayall(struct message msg);
//void file_read(void );
Link head;


int main()
{
int listenfd;
int sockfd;


pthread_t pid;




head = (Link)malloc(sizeof(Online));
head->next = head;

//file_read();


struct sockaddr_in server_addr;
    struct sockaddr_in client_addr;
socklen_t serverlen = sizeof(struct sockaddr_in);
socklen_t clientlen = sizeof(struct sockaddr_in);


if((listenfd = socket(AF_INET,SOCK_STREAM,0)) < 0)
ERR("------socket error:");
else
printf("------socket successfully !\n");


//bzero(&server_addr,sizeof(struct sockaddr_in));
memset(&server_addr,0,sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr =htonl(INADDR_ANY);


int opt = 1;
if(setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt)) < 0)
ERR("------setsockopt error:");
else
printf("------setsockopt successfully !\n");


if(bind(listenfd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr_in)) < 0)
ERR("------bind error:");
else
printf("------bind successfully !\n");


if(listen(listenfd,SOMAXCONN) < 0)
ERR("------listen error:");
else
printf("------listen successfully !\n");




while(1)
{
if((sockfd = accept(listenfd,(struct sockaddr*)&client_addr,&clientlen)) < 0)
ERR("------accept error:");
else
printf("------accept successfully!\n");
printf("********IP : %s --- PORT : %d ------ ONLINE\n",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));
pthread_create(&pid,NULL,read_msg,(void *)sockfd);
}


    return 0;
}
/*
void file_read(void )
{
Link temp;
FILE *fp;


temp = head->next;


if((fp = fopen("liaotianshi.txt","w")) == NULL)
ERR("open file error:");

fseek(fp,0,SEEK_SET);

create_newnode(&new_node);
fread(newnode,sizeof(Online),1,fp);
insert_node(new_node);
while(!feof(fp))
{
create_newnode(&new_node);
fread(newnode,sizeof(Online),1,fp);
insert_node(new_node);
}
while(temp != head)
{
printf("++++++++++++++++++++++++++++++++++++%s\n",temp->name);
temp = temp->next;
}
temp = head->next;
fclose(fp);


}
*/
void create_link(Link *head)
{
create_newnode(head);
(*head)->next = (*head);
}


void create_newnode(Link *newnode)
{
(*newnode) = (Link)malloc(sizeof(Online));
is_malloc_ok(newnode);
}


void is_malloc_ok(Link *newnode)
{
if(*newnode == NULL)
ERR("------malloc error:");
}


void insert_node(Link newnode)
{
newnode->next = head->next;
head->next = newnode;
}




void * read_msg(void *arg)
{
int sockfd = (int)arg;


Link new_node;
int n_read;
struct message msg;
memset(&msg,0,sizeof(struct message));


while(1)
{
memset(&msg,0,sizeof(struct message));
n_read = recv(sockfd,&msg,sizeof(struct message),0);
if(n_read <= 0)
{
printf("------client quit %d!\n",n_read);
break;
}


printf("++++++++++++++++++++++++++++++++++++++++%s  %s\n",msg.name,msg.toname);
switch(msg.action)
{
case REGIN:{
  create_newnode(&new_node);
  new_node->clientfd = sockfd;
  strcpy(new_node->name,msg.name);
  strcpy(new_node->password,msg.password);
  insert_node(new_node);
  msg.action = REGSUC;
  send(sockfd,&msg,sizeof(struct message),0);
  printf("------already register  %d\n",new_node->clientfd);
      break;
      }
case LOGIN:{
  if(is_login(msg))
  {
  msg.action = LOGSUC;
  send(sockfd,&msg,sizeof(struct message),0);
  printf("------already login\n");
  break;
  }
  else
  {
  msg.action = LOGFAIL;
  send(sockfd,&msg,sizeof(struct message),0);
  printf("------there is no this people\n");
  break;
  }
  }
case FINDNAME:{
 if(findname(msg))
 {
 msg.action = FINDSUC;
 send(sockfd,&msg,sizeof(struct message),0);
 printf("------find successfully !\n");
 break;
 }
 else
 {
 msg.action = FINDFAIL;
 send(sockfd,&msg,sizeof(struct message),0);
 printf("------find failure !\n");
 break;
 }
 }
case CHATOUT:{
printf("(((((((((%s)))))))))\n",msg.toname);
    chat(msg);
    printf("1111111111111111\n");
    break;
    }
case SENDALL:sendall(msg);break;
case DISALL:displayall(msg);break;
default:break;
}
}
}


void displayall(struct message msg)
{
Link temp;
temp = head->next;
int tofd;


if(temp->next == head)
{
if(strcmp(msg.name,temp->name) == 0)
{
tofd = temp->clientfd;
}
}
else
{
while(temp != head)
{
if(strcmp(temp->name,msg.name) == 0)
{
tofd = temp->clientfd;
break;
}
temp = temp->next;
}
}


temp = head->next;
if(temp->next == head)
{
msg.action = DISALLSUC;
strcpy(msg.toname,temp->name);
send(tofd,&msg,sizeof(struct message),0);
}
else
{
while(temp != head)
{
msg.action = DISALLSUC;
   strcpy(msg.toname,temp->name);
send(tofd,&msg,sizeof(struct message),0);
sleep(1);
temp = temp->next;
}
}

}


void sendall(struct message msg)
{
Link temp;
temp = head->next;
int tofd;


if(temp->next == head)
{
if(strcmp(msg.name,temp->name) == 0)
{
msg.action = NOOTHER;
tofd = temp->clientfd;
send(tofd,&msg,sizeof(struct message),0);
}
}
else
{
while(temp != head)
{
if(strcmp(temp->name,msg.name) != 0)
{
msg.action = CHATIN;
tofd = temp->clientfd;
send(tofd,&msg,sizeof(struct message),0);
}
temp = temp->next;
}
}
}


void chat(struct message msg)
{
Link temp;
int tofd;


temp = head->next;

while(temp != head)
{
printf("++++++++++++++++++++++++++++++++++++%s\n",temp->name);
temp = temp->next;
}
temp = head->next;


if(temp->next == head)
{
if(strcmp(temp->name,msg.toname) == 0)
{
//printf("22222222222222222222\n");
tofd = temp->clientfd;
msg.action = CHATIN;
send(tofd,&msg,sizeof(struct message),0);
//printf("33333333333333333333333\n");
}
}
else
{
//printf("((((((((((((((((((((()))))))))))))))))))))");
while(temp != head)
{
// printf("%s\n",msg.toname);
if(strcmp(temp->name,msg.toname) == 0)
{
//printf("444444444444444444\n");
tofd = temp->clientfd;
msg.action = CHATIN;
printf("++++++++++++++++++++++++++++++++++++++++++++++%s\n",temp->name);
send(tofd,&msg,sizeof(struct message),0);
//printf("555555555555555555\n");
}
temp = temp->next;
}
}
}


int findname(struct message msg)
{
Link temp;
int flag = 0;


temp = head->next;
if(temp->next == head)
{
if(strcmp(temp->name,msg.toname) == 0)
flag = 1;
}
else
{
while(temp != head)
{
if(strcmp(temp->name,msg.toname) == 0)
{
flag = 1;
break;
}


temp = temp->next;
}
}


return flag;
}


int is_login(struct message msg)
{
int flag = 0;
Link temp;
temp = head->next;

if(temp->next == head)
{
if(strcmp(msg.name,temp->name) == 0)
{
if(strcmp(msg.password,temp->password) == 0)
flag = 1;
}
}
else
{
while(temp->next !=  head)
{
if(strcmp(msg.name,temp->name) == 0)
{
if(strcmp(msg.password,temp->password) == 0)
{
flag = 1;
break;
}
}
temp = temp->next;
}
}


return flag;
}
内容概要:本文围绕直驱式永磁同步电机(PMSM)的矢量控制策略开展系统性研究,基于Simulink平台构建了完整的闭环仿真模型,深入探讨了电机在矢量控制下的动态响应特性与控制性能。研究内容涵盖了矢量控制的核心理论与关键技术模块,包括Clarke与Park坐标变换、转子磁场定向控制(FOC)、SVPWM调制算法、双闭环PI控制器(电流环与速度环)的设计与参数整定。通过仿真验证了系统在启动、突加负载及变速工况下的稳定性、抗干扰能力与动态调节精度,有效实现了对电机转矩与转速的精确控制。该模型不仅有助于深化对PMSM控制机理的理解,也为高性能电机驱动系统的算法开发与工程化应用提供了可靠的仿真验证平台。; 适合人群:具备自动控制原理、电机学基础及Simulink仿真能力的电气工程、自动化、新能源等相关专业的高年级本科生、研究生以及从事电机驱动开发的初级科研人员与工程师。; 使用场景及目标:①作为高校课程设计、毕业设计或科研项目中PMSM控制系统的学习案例,用于掌握矢量控制算法的实现流程与模块化设计方法;②帮助研究人员理解各控制环节间的耦合关系,通过调整PI参数优化系统性能,并为进一步研究无传感器控制、弱磁扩速、先进非线性控制策略等高级课题奠定基础; 阅读建议:建议结合经典电机控制教材同步学习,重点剖析各功能模块的信号流向与数学原理,亲自动手搭建仿真模型,通过改变运行条件和控制器参数观察系统响应变化,从而深入掌握矢量控制系统的动态特性和调试技巧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值